CCF-CSP-2019-03-2二十四点[STL队列应用]
题目链接:http://118.190.20.162/view.page?gpid=T88
反思:不管是queue.front() 还是queue.back()都可以直接修改队头和队尾的值,不用弹出后计算完再加入。
代码:
#include<bits/stdc++.h>
using namespace std;
queue<int>qu;
queue<char>quc;
string str;
int main (){
int n;
ios::sync_with_stdio(false);
cin>>n;
int a,b;
for(int i=0;i<n;i++){
cin>>str;
qu.push(str[0]-'0');
for(int j=1;j<=6;j+=2){
b=str[j+1]-'0';
if(str[j]=='x'){
qu.back()*=b;
}
else if(str[j]=='/'){
qu.back()/=b;
}
else {
quc.push(str[j]);
qu.push(b);
}
}
while(quc.size()){
a=qu.front();
qu.pop();
if(quc.front()=='+'){
qu.front()+=a;
}
else qu.front()=a-qu.front();
quc.pop();
}
if(qu.front()==24)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
while(qu.size())qu.pop();
}
return 0;
}
错误代码:
错误原因,使用栈导致计算+-法的时候是从右往左进行,导致错误
加减法从右往左和从左往右计算的结果不一样
#include<bits/stdc++.h>
using namespace std;
stack<int> st;
stack<char>sch;
string strs[105];
string str;
int main (){
int n;
ios::sync_with_stdio(false);
cin>>n;
int a,b;
for(int i=0;i<n;i++)cin>>strs[i];
for(int i=0;i<n;i++){
str=strs[i];
//cin>>str;
st.push(str[0]-'0');
for(int i=1;i<6;i+=2){
a=st.top();
b=str[i+1]-'0';
//cout<<a<<" "<<b<<endl;
if(str[i]=='x'){
st.pop();
st.push(a*b);
}
else if(str[i]=='/'){
st.pop();
st.push(a/b);
}
else if(str[i]=='+'||str[i]=='-'){
sch.push(str[i]);
st.push(b);
}
}
while(sch.size()){
b=st.top();
st.pop();
a=st.top();
st.pop();
if(sch.top()=='+'){
st.push(a+b);
}
else {
st.push(a-b);
}
sch.pop();
//cout<<st.top()<<endl;
}
cout<<st.top()<<endl;
if(st.top()!=24)cout<<"No"<<endl;
else cout<<"Yes"<<endl;
while(st.size()){
st.pop();
}
}
return 0;
}
/*
10
9+3+4x3
5+4x5x5
7-9-9+8
5x6/5x4
3+5+7+9
1x1+9-9
1x9-5/9
8/5+6x9
6x7-3x6
6x4+4/5
*/

浙公网安备 33010602011771号