AcWing 3302. 表达式求值
原题链接
简单
作者:
五月雨_3
,
2021-03-14 19:57:44
,
所有人可见
,
阅读 391
对于y总解法的理解。
#include <cstdio>
#include <stack>
#include <cctype>
#include <unordered_map>
#include <cstring>
using namespace std;
const int maxn = 100010;
char expression[maxn];
void eval(stack<int>& num, stack<char>& op)
{
int numaTmp = num.top(); num.pop();
int numbTmp = num.top(); num.pop();
char opTmp = op.top(); op.pop();
int resTmp; //由于出栈顺序和入栈顺序相反,运算时要调换两数顺序
if(opTmp == '+') resTmp = numbTmp+numaTmp;
else if(opTmp == '-') resTmp = numbTmp-numaTmp;
else if(opTmp == '*') resTmp = numbTmp*numaTmp;
else resTmp = numbTmp/numaTmp;
num.push(resTmp);
}
int main(void)
{
unordered_map<char, int> priority{{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}}; //定义运算符的优先级
stack<int> num; //存放运算式中的数字及中间结果
stack<char> op; //存放运算式中的符号
scanf("%s", expression);
int len = strlen(expression);
for(int i = 0; i < len; i++)
{
if(isdigit(expression[i]))
{
int x = 0;
while(i < len && isdigit(expression[i]))
x = x * 10 + expression[i++] - '0';
num.push(x);
i--; //遇到不是数字的字符需要回退
}
else if(expression[i] == '(')
op.push(expression[i]);
else if(expression[i] == ')')
{
while(op.top() != '(')
eval(num, op);
op.pop(); //括号内表达式计算完之后要让左括号出栈
}
else
{
//优先级高的运算符先运算并保证合法使用运算符
while(op.size() && priority[op.top()] >= priority[expression[i]]) eval(num, op); //这里的while不能用if,否则最后一个while中会死循环,而最后一个while又不可缺少,所以这里必须用while
op.push(expression[i]);
}
}
while(op.size()) eval(num, op); //处理for循环中剩余的运算
printf("%d\n", num.top());
return 0;
}