AcWing 3302. 表达式求值
原题链接
中等
作者:
StudyTime
,
2024-09-24 15:52:01
,
所有人可见
,
阅读 1
C++ 代码
#include<iostream>
#include<stack>
#include<string>
#include<unordered_map>
using namespace std;
stack<int> num;
stack<char> op;
unordered_map<char, int> h{ {'+', 1}, {'-', 1}, {'*',2}, {'/', 2} };
//从数栈中取出两个数做运算(记得是第一个操作数对第二个操作数做运算)
void eval(){
int a = num.top();//第二个操作数
num.pop();
int b = num.top();//第一个操作数
num.pop();
char p = op.top();//运算符
op.pop();
int r = 0;//结果
//计算结果
if (p == '+') r = b + a;
if (p == '-') r = b - a;
if (p == '*') r = b * a;
if (p == '/') r = b / a;
num.push(r);
}
int main(){
string s;
cin >> s;
for(int i = 0 ; i < s.size() ; i++){
//这块内容就是将字符串中的数转换成int类型的数
if (isdigit(s[i]))
{
int x = 0, j = i;
//x用于存储当前提取出来的数字
//变量j用于记录i的位置,以便于后续的遍历
while (j < s.size() && isdigit(s[j]))
{
x = x * 10 + s[j] - '0';
//x * 10将之前的数字向左移动一位,为新的数字腾出个位位置。
//然后加上当前数字字符转换后的整数值,实现连续数字的累加。
//s[j] - '0'将字符s[j]转换为对应的整数值。
//例如,字符 '5' 减去字符 '0' 得到整数 5。
j++;
//继续向后检查,是否是数字
}
num.push(x);
//最终将数字放入数字栈中
i = j - 1;//结束这一步的操作之后for循环中i++,正好遍历之后的元素
}//如果遇到左括号的情况下,将运算符入栈,直到遇到右括号的情况时
//对括号里面的元素进行运算,最后记得将左括号弹出栈
else if(s[i] == '('){
op.push(s[i]);
}
else if(s[i] == ')'){
while(op.top() != '('){
eval();
}
op.pop();
}else{//如果不是数也不是左括号的情况下,只可能是普通的运算符号 了
//如果栈不为空而且栈顶的元素的优先级大于等于即将插入的符号的优先级的情况下
//将之前的进行运算。
while(op.size() && h[op.top()] >= h[s[i]]){
eval();
}
//将这个本来就要插入的元素放进去
op.push(s[i]);
}
}
//遍历完成之后对栈中的元素进行运算,最后栈顶即为所求
while(op.size()) eval();
cout << num.top() <<endl;
}