输入:
10
9+3+4*3
5+4*5*5
7-9-9+8
5*6/5*4
3+5+7+9
1*1+9-9
1*9-5/9
8/5+6*9
6*7-3*6
6*4+4/5
提示:1.把 - 号后面的数字变成相应的负数,再把 - 号变成 + 号(所以只剩+、/、x)
2.设一个数据栈,按顺序遍历表达式,第一个数字直接入栈,后面的数字如果前面的运算符是+,直接入栈,否则取出栈顶数字与该数字进行 x或/运算,将运算结果入栈 。最后顺序遍历数据栈求和即可
3.WA到心态爆炸的!!!!老老实实的看题目做,乘法是x而不是*
#include <stack>
using namespace std;
int main()
{
int n;
int a[4];
char b[3];
cin >> n;
while(n--) {
string ss;
cin >> ss;
for(int i = 0; i < ss.length(); i++) {
if(i % 2 == 0) {
a[i/2] = ss[i] - '0';
if(ss[i-1] == '-') a[i/2] = -a[i/2];//如果前面的符号是-,该数变成对应的负数
} else {
b[(i-1)/2] = ss[i];
}
}
for(int i = 0; i < 3; i++) {//将-改为+
if(b[i] == '-') b[i] = '+';
}
stack<int>s;
for(int i = 0; i < 4; i++) {
if(i == 0) s.push(a[i]);//第一个元素直接入栈
else {
if(b[i-1] == '/') {//前面符号是x、/取出栈顶元素进行计算,结果入栈
int temp = s.top();
s.pop();
temp = temp / a[i];
s.push(temp);
} else if(b[i-1] == 'x') {
int temp = s.top();
s.pop();
temp = temp * a[i];
s.push(temp);
} else {//前面符号是+ 直接入栈
s.push(a[i]);
}
}
}
int sum = 0;
while(!s.empty()) {
int temp = s.top();
s.pop();
sum += temp;
}//遍历最后的数据栈求和
if(sum == 24) cout << "Yes" <<endl;
else cout << "No" << endl;
}
return 0;
}
知识兔