从另一篇题解里看到的(无限套娃 /狗头)讲的很详细
要比较运算符的优先级,如果要入栈的优先级比较小,则可以算栈里面的值,而且是一直算,这里完全都不需要考虑顺序,因为入栈时候的操作已经自然的解决了顺序的问题。就是说不用考虑原本是 ${a} {+} {b} {-} {c}$ 变成 ${c} - {b} + {a}$ 的情况
代码
#include<iostream>
#include<map>
#include<stack>
using namespace std;
map<char, int>m{ {'+', 1}, {'-', 1}, {'x', 2}, {'/', 2} };
int caculate(int a, int b, char c) {
if (c == '+') return a + b;
if (c == '-') return a - b;
if (c == 'x') return a * b;
if (c == '/') return a / b;
}
int main() {
int n;
scanf("%d", &n);
while (n--) {
string s;
stack<int>k;
stack<char>c;
cin >> s;
int len = s.length();
for (int i = 0; i < len; i++) {
if (s[i] <= '9' && s[i] >= '0') k.push(s[i] - '0');
else {
if (!c.size()) c.push(s[i]);
else {
while (c.size() && m[s[i]] <= m[c.top()]) {
int a = k.top(); k.pop();
int b = k.top(); k.pop();
k.push(caculate(b, a, c.top()));
c.pop();
}
c.push(s[i]);
}
}
}
while (c.size()) {
int a = k.top(); k.pop();
int b = k.top(); k.pop();
k.push(caculate(b, a, c.top()));
c.pop();
}
if (k.top() == 24) printf("Yes\n");
else printf("No\n");
}
return 0;
}