简单的表达式计算,逆波兰算法应用。这个题简单,因为没有涉及括号问题,且数字均为1-9,不用判断连续的数字,是前两道题也很正常。先得到后缀表达式,再进行后缀表达式的计算。(这道题在编辑器上我用vscode和Dev都试了,运行一部分就发生异常,不得不终止,说是什么有路径问题,总之就是符号的一些原因,看着没错,直接提交的,过了。)
#include <iostream>
#include <stack>
using namespace std;
string houzhui(string s) {//得到后缀表达式
stack<char> st;
string res = "";
for (int i = 0; i < s.length(); i++) {
if (s[i] >= '0' && s[i] <= '9')
res += s[i];
else {
char ch = s[i];
if (ch == '+' || ch == '-') {
while (!st.empty()) {
res += st.top();
st.pop();
}
st.push(ch);
} else if (ch == 'x') {
while (!st.empty() && st.top() == 'x' || st.top() == '/') {
res += st.top();
st.pop();
}
st.push(ch);
} else if (ch == '/') {
while (!st.empty() && st.top() == 'x' || st.top() == '/') {
res += st.top();
st.pop();
}
st.push(ch);
}
}
}
while (!st.empty()) {
res += st.top();
st.pop();
}
return res;
}
int getres(string s) {//后缀表达式的计算
stack<int> st;
for (int i = 0; i < s.length(); i++) {
if (s[i] >= '0' && s[i] <= '9')
st.push(s[i] - '0');
else {
if (st.size() >= 2) {
int a = st.top();
st.pop();
int b = st.top();
st.pop();
if (s[i] == '+')
st.push(a + b);
else if (s[i] == '-')
st.push(b - a);
else if (s[i] == 'x')
st.push(a * b);
else
st.push(b / a);
}
}
}
return st.top();
}
int main() {
int n;
cin >> n;
string s, ss;
while (n--) {
cin >> s;
ss = houzhui(s);
int res = getres(ss);
if (res == 24)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
return 0;
}