中缀表达式求值

直接上代码!

在这里插入代码片
#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();
}
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐