本题由于算式固定,可以采用数组比较讨巧的方式计算,但我看到运算的第一反应是用栈……所以这个算法会比较复杂。
只要会使用栈来进行加减乘除的运算,并且注意本次输入的乘法符号是"x"而不是"*"即可得到满分。
栈是先进后出的一种线性表,具体可以看数据结构中栈的定义。
用栈进行运算时一定要判断好运算符的优先级,这里设定加减法优先级比乘除低,根据运算习惯遇到同级运算时也会将其出栈进行计算。
满分代码如下:
#include<iostream>
#include<cstring>
#include<stack>
using namespace std;
char a[101][1000];
int cal(int x,int y,char a){ //判断运算
switch(a){
case '+':{
return x+y;
}
case '-':{
return y-x;
}
case 'x':{
return x*y;
}
case '/':{
return y/x;
}
}
}
int main(){
int n,x,y;
stack<int> b; //装数字的栈
stack<char> c; //装数符的栈
char d;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<n;i++){
for(int j=0;j<strlen(a[i]);j++){
if(a[i][j]>='0'&&a[i][j]<='9') b.push(a[i][j]-'0');
if(a[i][j]=='+'){
while(!c.empty()&&(c.top()=='-'||c.top()=='x'||c.top()=='/')){ //判断优先级
d=c.top(); //取出栈中的数字和数符进行计算,将计算结果压回数字栈
c.pop();
x=b.top();
b.pop();
y=b.top();
b.pop();
b.push(cal(x,y,d));
}
c.push(a[i][j]);
}
if(a[i][j]=='-'){
while(!c.empty()&&(c.top()=='x'||c.top()=='/'||c.top()=='-')){
d=c.top();
c.pop();
x=b.top();
b.pop();
y=b.top();
b.pop();
b.push(cal(x,y,d));
}
c.push(a[i][j]);
}
if(a[i][j]=='x'){
while(!c.empty()&&(c.top()=='/')){
d=c.top();
c.pop();
x=b.top();
b.pop();
y=b.top();
b.pop();
b.push(cal(x,y,d));
}
c.push(a[i][j]);
}
if(a[i][j]=='/'){
while(!c.empty()&&(c.top()=='x'||c.top()=='/')){
d=c.top();
c.pop();
x=b.top();
b.pop();
y=b.top();
b.pop();
b.push(cal(x,y,d));
}
c.push(a[i][j]);
}
}
while(!c.empty()){ //将剩余运算全部算出
d=c.top();
c.pop();
x=b.top();
b.pop();
y=b.top();
b.pop();
b.push(cal(x,y,d));
}
if(b.top()==24) cout<<"Yes";
else cout<<"No";
if(i<n-1) cout<<"\n";
while(!b.empty()) b.pop(); //每次运算结束后将两个栈置空
while(!c.empty()) c.pop();
}
return 0;
}