思路:我采用堆栈的处理方式进行。定义一个符号栈,一个数字栈。遇到乘法和除法则取出栈顶元素和下一个元素进行运算,如果是加法压入将加符号压入符号栈。如果是减法,则将后面要接的数变成负数压入栈中,然后压入一个'+'压入符号栈。具体看代码。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<stack>
using namespace std;
int main(){
int n;
int i,j;
int a,b;
char s[100][30];
scanf("%d",&n);
getchar();
for(i=0;i<n;i++){
scanf("%s",s[i]);
}
stack<char>ch;
stack<int>num;
for(i=0;i<n;i++){
// printf("%s ",s[i]);
while(!num.empty()) num.pop();//清空前一次的
while(!num.empty()) ch.pop();
for(j=0;j<7;j++){
if(s[i][j]-'0'>0&&s[i][j]-'0'<=9){//题目说了1-9
num.push(s[i][j]-'0');
}
if(s[i][j]=='+'){
ch.push(s[i][j]);
}
if(s[i][j]=='-') {//由于堆栈先进后厨,然后处于加减法运算,是从左向右的,因此全部变成加法运算,这样从左向右和从右向左都一样了。
ch.push('+');
num.push((s[i][++j]-'0')*(-1));
}
if(s[i][j]=='x'){
a=num.top();
num.pop();
b=s[i][++j]-'0';//这里一定要变成数字型啊
num.push(a*b);
// printf("%d b ",b);
}
if(s[i][j]=='/'){
a=num.top();
num.pop();
b=s[i][++j]-'0';
num.push(a/b);
}
}
int re=num.top();
num.pop();
char c;
// printf("%d %d\n",ch.size(),num.size());
while(!ch.empty()){
c=ch.top();
ch.pop();
if(c=='+'){
// printf("%d re",re);
re=re+num.top();
num.pop();
}else{
// printf("%d re",re);
re=re-num.top();//由于栈是从后往前面算的,对于符号要注意一下,顺序。前面减后面
num.pop();
}
}
if(re==24)
printf("Yes\n");
else{
printf("No\n");
}
}
return 0;
}
推荐一个大佬的做题方法,没有用堆栈,用C语言函数调用,成功解决了优先级问题。https://blog.csdn.net/yuanfangyoushan/article/details/100568475