这个题学了数据结构之后其实非常简单。
就一个运算符栈digit,一个操作符栈op.
那么逻辑是,如果是数字,直接进数字栈。
如果是操作符
如果栈顶优先级高于当前操作符。那么先让digit栈的栈顶两元素做当前运算。然后op栈顶弹出,直到栈顶元素的优先级小于当前的操作符,所以这里需要加上一个循环。而不是简单的一个if
然后就很简单了,思路指导代码。我这个代码写的有点不是很好看,凑合看吧。另外有个要注意的地方就是,这里的那个*不是* 而是x。
在这里我简单介绍一下我的函数preceed,这个是判断优先级的函数,第一参数表示栈顶操作符,第二参数表示当前操作符。
细心的注意到了这里最开始的时候s+='#'.
而且操作符栈op.push('#').
如果是最后一个怎么判断它已经完了呢?如果是栈底第一个怎么判断它的优先级呢?就靠这个#来进行标识,栈里的#优先级是最低的。这个,害,好像不是很好描述。就编译原理里面也有这种思想。自己模拟一下就能够理解了,我觉得干这种事不应该着急着打代码的,,而是先模拟一下过程清楚思路
#include<iostream>
#include<stack>
#include<algorithm>
using namespace std;
char preceed(char a,char b);
int main()
{
string s;
int n;
cin>>n;
stack<int > digit;
stack<char > op;
while(cin>>s){
s+="#";
op.push('#');
for(int i=0;i<s.length();i++){
if(s[i] <= '9' && s[i] >= '0'){
digit.push(s[i]-'0');
}else {
int down,up;
if(preceed(op.top(),s[i]) == '<'){
op.push(s[i]);
}else {
while(preceed(op.top(),s[i]) == '>'){
if(op.top() == '+'){
up = digit.top();
digit.pop();
down = digit.top();
digit.pop();
digit.push(up+down);
}else if(op.top() == '-'){
up = digit.top();
digit.pop();
down = digit.top();
digit.pop();
digit.push(down-up);
}else if(op.top() == 'x'){
up = digit.top();
digit.pop();
down = digit.top();
digit.pop();
digit.push(down*up);
}else if(op.top() == '/'){
up = digit.top();
digit.pop();
down = digit.top();
digit.pop();
digit.push(down/up);
}
op.pop();
}
op.push(s[i]);
}
}
}
if(!digit.empty() && digit.top() == 24){
printf("Yes\n");
}else{
printf("No\n");
}
}
return 0;
}
char preceed(char a,char b){
switch (a){
case '#':
if(b == '#') return '=';
return '<';
case '+':
case '-':
switch (b){
case '+':
case '-':
case '#':
return '>';
case 'x':
case '/':
return '<';
}
case 'x':
case '/':
return '>';
}
}
来源:CSDN
作者:未空blog
链接:https://blog.csdn.net/weixin_42324904/article/details/103546417