中缀表达式转后缀表达式求值

慕课MOOC表达式求值

前言

一、后缀表达式是什么?

后缀表达式计算与前缀表达式类似,只是顺序是从左至右,具体过程如下:
从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 op 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果

例如:后缀表达式为“2 3 + 4 × 5 -”计算过程如下:
  (1)从左至右扫描,将 2 和 3 压入堆栈;
  (2)遇到 + 运算符,因此弹出 3 和 2( 3 为栈顶元素,2 为次顶元素,注意与前缀表达式做比较),计算出 3+2 的值,得 5,再将 5 入栈;
  (3)将 4 入栈;
  (4)接下来是 × 运算符,因此弹出 4 和 5,计算出 4 × 5 = 20,将 20 入栈;
  (5)将 5 入栈;
  (6)最后是-运算符,计算出 20-5 的值,即 15,由此得出最终结果。

二、中缀表达式转化成后缀表达式

1.中缀表达式转换后缀表达式示例

在这里插入图片描述

2.符号运算操作

从头到尾读取中缀表达式的每个对象,对不同对象按不同的情况处理
① 运算数:直接输出;
② 左括号:压入堆栈;
③ 右括号:将栈顶的运算符弹出并输出,直到遇到左括号(出栈,不输出);
④ 运算符:
• 若优先级大于栈顶运算符时,则把它压栈;
• 若优先级小于等于栈顶运算符时,将栈顶运算符弹出并输出;再比
较新的栈顶运算符,直到该运算符大于栈顶运算符优先级为止,然
后将该运算符压栈;
⑤ 若各对象处理完毕,则把堆栈中存留的运算符一并输出。

3.C++语言代码

代码如下(示例):

#include<iostream>
#include<string.h>
#include<stack>
using namespace std;
stack<char> a;
char str[105];
char s[105];
int Stack[60];
int top = -1;
int i,k = 0;
void Count()
{
	for(i = 0;i<strlen(s);i++)
	{
		if(s[i]==' ') continue;
		switch(s[i])
		{
			case '+': Stack[--top]+=Stack[top+1];break;
			case '-': Stack[--top]-=Stack[top+1];break;
			case '*': Stack[--top]*=Stack[top+1];break;
			case '/': Stack[--top]/=Stack[top+1];break;
			default : Stack[++top] = s[i]-'0'  ;break;
		}
	}
	printf("\n%d",Stack[top]);
}
int num(char ch)
{
	int flag;
	if(ch=='+'||ch=='-') flag = 1;
	if(ch=='*'||ch=='/') flag = 2;
	if(ch=='(') flag = 3;
	if(ch==')') flag = 0;
	return flag;
}
bool Judge(char ch)
{
	int x,y;
	if(a.empty()||a.top()=='(') return false; //左括号在进入堆栈后,优先级降为最低
	x = num(a.top());
	y = num(ch);
	if(x>=y) return true;
	else return false;
}
int main()
{
	gets(str);
	for(int j = 0;j<strlen(str);j++)
	{
		bool flag;
		if(str[j]==' ')
		{
			continue;
		}
		if(str[j]>='0'&&str[j]<='9')
		{
			printf("%c",str[j]);
			s[k++] = str[j];
			continue;
		}
		if(a.empty())
		{
			a.push(str[j]);
			continue;
		}
		if(str[j]==')')
		{
			while(a.top()!='(')
			{
				printf("%c",a.top());
				s[k++] = a.top();
				a.pop();
			}
			a.pop();
			continue;
		}
		flag = Judge(str[j]);
		if(flag==true)
		{
			while(flag==true)
			{
				printf("%c",a.top());
				s[k++] = a.top();
				a.pop();
				flag = Judge(str[j]);
				if(!flag)
				{
					a.push(str[j]);
					break;
				}
			}
		}
		else if(!flag)
		{
			a.push(str[j]);
			continue; 
		}
	}
	while(!a.empty())
	{
		printf("%c",a.top());
		s[k++] = a.top();
		a.pop();
	}
	Count();
	return 0;
}

代码效果

在这里插入图片描述

注意点

在处理括号时,注意第一次遇到左括号时,左括号为最高的优先级,进入堆栈后,左括号优先级降为最低

结语

大家好,这是我的代码,新人首篇喜欢能帮助到大家在这里插入图片描述

当然最最最重要的是相互交流学习~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老帅比阿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值