题目链接: click me
利用栈来解决算数问题中的优先级问题
根据蓝桥杯最后一题暴力求解联想的相关题目
文献参考: 海绵宝宝
#include <bits/stdc++.h>
using namespace std;
stack<int> num;
stack<char> op;
//设计一个哈希表来存储运算符的优先级
unordered_map<char,int> h = {{'+',1},{'-',1},{'*',2},{'/',2}};
void eval(){
int a,b;
a = num.top();//取出第一个数
num.pop();
b = num.top();//...
num.pop();
char c = op.top();//取出运算符
op.pop();
//计算结果后,压入数字栈顶
if(c == '+') num.push(a + b);
if(c == '-') num.push(a - b);
if(c == '*') num.push(a * b);
if(c == '/') num.push(a / b);
}
int main(){
string a;
cin >> a;
for(int i = 0;i < a.size();i++){
if(isdigit(a[i])){//如果当前是数字就不断向后看直到不是数字为止,并压入数字栈
int x = 0,j = i;
while(j<a.size() && isdigit(a[j])){
x = x * 10 + (a[j] - '0');
j++;
}
num.push(x);
i = j - 1;//从最后一个数字的下一位开始
}else if(a[i] == '('){//如果是左括号先入栈
op.push(a[i]);
}else if(a[i] == ')'){//如果是右括号持续计算直到找到左括号
while(op.top()!='('){
eval();
}
op.pop();
}else{//其他情况下,如果待入栈的优先级小于等于栈顶,先计算一下再入栈
while(op.size() && h[op.top()] >= h[a[i]]){
eval();
}
op.push(a[i]);
}
}
while(op.size()) eval();//如果还有运算符,消耗
cout << num.top() << endl;
return 0;
}