这里的中缀表达式包含括号运算
解释和说明都在代码的注释中,不多说,直接上代码。
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int N = 10010; //表达式的长度最多为1e5
int num[N]; //中缀表达式求值采用双栈操作 一个是数值栈 一个是操作符栈
char op[N];
int t = -1; //t为栈num的下标
int tt = -1; //tt为栈op的下标
int map(char ch) //模拟哈希表映射 作用是得到字符对应的优先级 优先级高先进行运算
{
if (ch == '+' || ch == '-')
return 1;
else if (ch == '*' || ch == '/')
return 2;
else
return 0;
}
void eval() //求值函数 b = num[t--]代表获取栈顶元素并且将其弹出 num[++t] = a + b 代表压栈
{
int b = num[t--];
int a = num[t--];
int operation = op[tt--];
if (operation == '+') num[++t] = a + b;
else if (operation == '-') num[++t] = a - b;
else if (operation == '*') num[++t] = a * b;
else if (operation == '/') num[++t] = a / b;
}
int main()
{
string str;
cin >> str;
for (int i = 0; i < str.size(); i++)
{
char c = str[i];
if (isdigit(c)) //先判断数字 下面几个分支均为判断 operation
{
int number = 0;
int j = i;
while (j < str.size() && isdigit(str[j])) //此处要加上 j < str.size()
number = number * 10 + str[j++] - '0';
i = j - 1;
num[++t] = number;
}
else if (c == '(') //用栈一大好处就是可以对应匹配括号 类似((( )))这样的情况
op[++tt] = c;
else if (c == ')') //若找到了右括号 那么就将对应括号内的表达式全部计算完成
{
while (op[tt] != '(')
eval();
tt--; //弹出左括号
}
else
{
//这里要注意操作的顺序 要先判断优先级当前栈顶元素是否可以进行计算 再将正在判断的字符压栈
//若正在判断的字符优先级更低或相等 如 * 与 +、 + 与 + 的情况 说明可以直接先计算(计算这个子树)
while (tt >= 0 && map(op[tt]) >= map(str[i])) //这边要改为 while 其中 优先级比较的是 栈顶元素 和 当前正在判断的字符
eval();
op[++tt] = c;
}
}
while (tt >= 0) eval(); //若还有剩余operation 说明还有表达式没算完 直至完成计算
cout << num[t];
}