201903-2 二十四点
试题编号: 201903-2
试题名称: 二十四点
时间限制: 1.0s
内存限制: 512.0MB
问题描述:
数据输入块:
输入样例
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
输出样例
Yes
No
No
Yes
Yes
No
No
No
Yes
Yes
思路:
开始一看到题,就想起了被表达式转换支配的日子。。。。开始的思路也是按照栈去写,然后在csdn上看到了philpanic9发的博客,使用deque双端队列写的,发现了stl容器的强大!!!寒假回去还是要把stl容器给好好看看,只拿c语言学的那些知识做这种题也太难受了。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
while(n--){
string str;
cin >> str;
deque<char> ys; //运算符队列
deque<int> num; //运算数队列
char ch;
int num1,num2;
for(int i = 0;i < str.size();i++){
ch = str[i];
if(ch > '0' && ch <= '9'){ //字符是数字的话,直接压入数队列的尾部
num.push_back(ch-'0');
}
else if(ch == 'x' || ch =='/'){ //字符是'*'和'/'的话,可以进行计算
num1 = num.back(); //取出数队列的最后一个,也就是运算符前一个数
num.pop_back(); //一定记得取出值后要把这个数弹出队列
num2 = str[++i] - '0'; //另一个运算数还没遍历到,所以提前用++i把它取出来用
if(ch == 'x'){
num.push_back(num1*num2); //要把结果继续压入数队列中
}
if(ch == '/'){
num.push_back(num1/num2);//要把结果继续压入数队列中
}
}
else if(ch == '+'||ch == '-'){ //加减的优先级低于乘除,先压入队列不管
ys.push_back(ch);
}
}
while(!ys.empty()){ //如果运算符队列不空就说明还有计算要进行
int num3;
ch = ys.front(); //从这开始,取出的元素都应该从队列头部去取了
ys.pop_front();
num1 = num.front();
num.pop_front();
num2 = num.front();
num.pop_front();
if(ch == '+'){
num3 = num1+num2;
num.push_front(num3); //运算结果需要压入数队列头部,以继续运算
}
else if(ch == '-'){
num3 = num1-num2;
num.push_front(num3);//运算结果需要压入数队列头部,以继续运算
}
}
if(num.front() == 24){ //数队列最后剩的数就是最终结果
cout << "Yes" << endl;
}else{
cout << "No" <<endl;
}
}
}