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

慕课MOOC表达式求值

文章目录

  • 慕课MOOC表达式求值
  • 前言
  • 一、后缀表达式是什么?
  • 二、中缀表达式转化成后缀表达式
    • 1.中缀表达式转换后缀表达式示例
    • 2.符号运算操作
    • 3.C++语言代码
    • 代码效果
    • 注意点
    • 结语

前言

一、后缀表达式是什么?

后缀表达式计算与前缀表达式类似,只是顺序是从左至右,具体过程如下:
从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 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.中缀表达式转换后缀表达式示例

中缀表达式转后缀表达式求值_第1张图片

2.符号运算操作

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

3.C++语言代码

代码如下(示例):

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

代码效果

中缀表达式转后缀表达式求值_第2张图片

注意点

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

结语

大家好,这是我的代码,新人首篇喜欢能帮助到大家中缀表达式转后缀表达式求值_第3张图片

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

你可能感兴趣的:(c++,数据结构,栈)