中缀表达式求值
中缀表达式求值的运算方法为
- 当遇到数值直接压入数值栈
- 当遇到运算符时比较运算符栈栈顶运算符的优先级,如果大于等于当前运算符优先级,则弹出两个数值进行运算,并入栈
- 当遇到(时直接入栈
- 当遇到)时计算直到(
代码用到了一点小技巧,首先在运算符栈里面存放了一个优先级最低的字符(‘q’),因此当第一个运算符比较优先级时一定大于栈顶优先级,故此实现第一个入栈的运算符不会进行运算(这种方法解决了每次都判断是否为第一个运算符的问题),并且在表达式最后加入了一个第二低优先级的符号(‘p’),相当于数学里面的等号,起到开始运算直到遇到‘q’。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
map<char,int> prio;//存放运算符优先级
stack<char>oper;//定义运算符栈
stack<int>num;//定义数值栈
void init(){//设置运算符的优先级,并在栈里面放入一个最低优先级的字符
prio['-']=prio['+']=1;
prio['*']=prio['/']=2;
prio['p']=0;
prio['q']=-1;
oper.push('q');
}
int cal(int d,int e,char c){//运算符计算
switch(c){
case '+' :return e+d;
case '-' :return e-d;
case '*' :return e*d;
c