思路 表达式求值问题都可以借助“栈”来进行求解,可参照《数据结构与算法》。 在c++中,栈包含在头文件stack中。 定义方式可以采用:stack<数据类型> s; 常用操作有: s.top() 返回栈顶元素的引用,但不移除 s.push(value) 将元素压栈 s.pop() 从栈中移除栈顶元素,但不返回 s.size() 返回栈中元素个数 s.empty() 返回栈是否空
代码示例
#include<iostream>
#include<string>
#include<stack>
using namespace std;
int isprior(char a, char b) {
if (a == '+' || a == '-')
return 1;
else if (b=='x'||b=='/')
return 1;
else
return 0;
}
int main() {
int n;
cin >> n;
stack<int> num;
stack<char> op;
string ans[100];
char c;
int i, j;
for (i = 0; i < n; i++) {
int flag = 1;
for (j = 0; j < 7; j++) {
cin >> c;
if (c >= '1'&&c <= '9')
num.push(c - '0');
else {
if (flag == 1) {
op.push(c);
flag = 0;
}
else {
if (isprior(c, op.top())) {
char e;
e = op.top();
op.pop();
int num1, num2, res;
num2 = num.top();
num.pop();
num1 = num.top();
num.pop();
switch (e) {
case '+': res = num1 + num2; break;
case '-': res = num1 - num2; break;
case 'x': res = num1 * num2; break;
case '/': res = num1 / num2; break;
}
num.push(res);
}
op.push(c);
}
}
}
while (!op.empty()) {
char _e;
_e = op.top();
op.pop();
int _num1, _num2, _res;
_num2 = num.top();
num.pop();
_num1 = num.top();
num.pop();
switch (_e) {
case '+': _res = _num1 + _num2; break;
case '-': _res = _num1 - _num2; break;
case 'x': _res = _num1 * _num2; break;
case '/': _res = _num1 / _num2; break;
}
num.push(_res);
}
if (num.top() == 24)
ans[i] = "Yes";
else
ans[i] = "No";
}
for (i = 0; i < n; i++)
cout << ans[i] << endl;
return 0;
}
|