中缀表达式求值

本文提供了一种使用栈来解析并计算中缀表达式的算法实现。通过输入中缀表达式,程序会逐个处理字符,区分数字和运算符,并利用栈结构进行计算。对于数字,直接压入数字栈;对于运算符,则根据其优先级与运算符栈顶元素的优先级进行比较决定是否执行计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

中缀表达式求值

直接上代码!

在这里插入代码片
#include<iostream>
#include<stack>
#include<string>
using namespace std;
typedef struct opera
{
	char ch;
	int level;
}Oper;
Oper str[10] = {{'+',2}, {'-',2}, {'*',3}, {'/',3}, {'%',3},{'(',1}};    //将运算符的优先级存入结构体数组中
stack<int> S1;         //数字栈
stack<Oper> S2;        //运算符栈
void func();
int main()
{
	cout << "请输入表达式!!" << endl;
	string s;
	cin >> s;
	for (int i = 0; i < s.size(); i++)
	{
		if (s[i] >= '0' && s[i] <= '9')        //如果是数字
		{
			int j = i + 1;
			int cnt = s[i] - '0';
             //如果是数字入栈,在字符串中大于9的数字是由多个字符构成,需要将其便是几位的数字
			while (s[j] >= '0' && s[j] <= '9')
			{
				cnt = cnt * 10 + (s[j] - '0');
				j++;
			}
			S1.push(cnt);     //将数字入栈
			i = j - 1;
		}
		else               //如果是字符
		{
			if (s[i] == '(')      //左括号直接入栈
			{
				Oper t;
				t.ch = '(';
				t.level = 1;
				S2.push(t);
			}
			else if (s[i] == ')')   //如果是右括号弹出一个运算符以及两个操作数进行运算,直到遇到左括号
			{
				while (S2.top().ch != '(')
				{
					func();
				}
				S2.pop();     //使左括号出栈
			}
			else           //如果是运算符
			{
				if (S2.empty())                //第一个运算符直接入栈
				{
					for (int k = 0; k < sizeof(str) / sizeof(str[0]); k++)
					{
						if (s[i] == str[k].ch) {
							S2.push(str[k]);
							break;
						}
					}
				}
                //符号栈不为空,比较当前运算符和栈顶元素的优先级,如果大于栈顶元素优先级则入栈,否则将栈顶运算符拿出运算后,将				//当前运算符入栈,将结果入数字栈
				else      
				{
					for (int k = 0; k < sizeof(str) / sizeof(str[0]); k++)
					{
						if (s[i] == str[k].ch)
						{
							if (str[k].level > S2.top().level)    S2.push(str[k]);
							else               //取出两个操作数运算
							{
								func();
								S2.push(str[k]);
							}
						}
					}
				}
			}
		}
	}
     //当表达式字符串结束后弹一个运算符两个数字进行运算,然后将结果压入数字栈,直到栈空将最终结果压入数字栈
	while (!S2.empty())    
	{
		func();
	}
	cout << "结果为:" << S1.top();        //输出最终结果
	return 0;
}
void func()            //运算函数
{
	int first = S1.top();
	S1.pop();
	int second = S1.top();
	S1.pop();
	int res = 0;
	switch (S2.top().ch)
	{
		case '+': res = first + second;
			break;
		case '-': res = second - first;
			break;
		case '*': res = second * first;
			break;
		case '/': res = second / first;
			break;
		case '%': res = second % first;
			break;
		default:
			break;
	}
	S1.push(res);
	S2.pop();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值