栈与中缀表达式求值

这里的中缀表达式包含括号运算

解释和说明都在代码的注释中,不多说,直接上代码。

#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];
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值