《大话数据结构3》中缀表达式转换为后缀表达式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34536551/article/details/83654687

中缀表达式转换为后缀表达式


一、表达式的三种形式:

●  中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3。我们从小做数学题时,一直使用的就是中缀表达式。

● 后缀表达式:不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则),如:2 1 + 3 *。又比如3+(6-4/2)*5=23的后缀表达式为:3642/-5*+#  (#符号为结束符)。后缀表达式 也叫做逆波兰表达式。

● 前缀表达式:同后缀表达式一样,不包含括号,运算符放在两个运算对象的前面,如:* + 2 1 3 。前缀表达式和后缀表达式其实是差不多的,只不过符号位置不同而已,前缀表达式不是很常见。前缀表达式也叫做“波兰表达式”

二、中缀表达式转换为后缀表达式:(思路)

● 从左到右依次遍历中辍表达式的每个数字和符号

 (1)若是数字、就输出;成为后辍表达式的一部分。

 (2)若是符号,则判断当前的符号与栈顶符号的优先级,

若是右括号“ )”,我们要去匹配前面的左括号 “ ( ”,然后栈顶元素依次往下出栈, 直到遇到 “ ( ”。 输出的时候把 “ ( ” 括号 和 “ ) ” 括号之间的数字或符号成为后辍表达式的一部分,  左括号和右括号我们就丢弃不要了。

若是当前的符号低于栈顶的符号或者优先级等于当前的符号,那么从栈顶开始,依次弹出比当前处理的运算符优先级高的运算符,直到一个比它优先级低的或者遇到了一个左括号就停止。

(3)然后将当前的符号进栈。

(4) 重复循环,直到最终输出后辍表达式的为止。


与二叉树关系


前缀表达式对应于二叉树的前序遍历

中缀表达式对应于二叉树的中序遍历

后缀表达式对应于二叉树的后序遍历


根据中缀表达式生成二叉树


表达式“X=A+B*(C-D)/E”的后缀表示形式可以为?

按照操作符的优先级,其二叉树的生成过程:

1.括号的优先级最高,根为-,左孩子为C,右孩子为D


2.接下来是乘法,根为*,左孩子为B,右孩子为1的树


3.接下来是除法,跟为/,左孩子为2的树,右孩子为E


4.接下来是加法,根为+,左孩子为A,右孩子为3的树


5.接下来是=号,左孩子是X,右孩子是4的树


剩下的就是前序和后序遍历二叉树即可。

其结果为:后序遍历序列是: XABCD-*E/+=


运用后缀表达式进行计算:


(1)建立一个栈S;

(2)从左到右读后缀表达式,读到数字就将它转换为数值压入栈S中,读到运算符则从栈中依次弹出两个数分别到Y和X,然后以“X 运算符 Y”的形式计算机出结果,再压加栈S中;

(3)如果后缀表达式未读完,就重复上面过程,最后输出栈顶的数值则为结束。

举例:

3+(2-5)*6/3=-3 ,其后缀表达式为:325-6*3/+。其运算结果如下:

45270e43-7c61-4ac2-af8f-efb437e8d742


后辍表达式计算结果


 这里写图片描述

规则:

从左到右遍历表达式的每个数字和符号,运到数字就进栈,

运到的是符号,就将处于栈顶两个数字出栈, 进行运算。

运算结果进栈。

重复步骤,一直运算到结果为止。

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

注意: 如果我们见到任何其他的符号(+,*,(),那么我们从栈中弹出栈元素直到发现优先级更低的元素为止。有一个例外:除非是在处理一个)的时候,否则我们决不从栈中移走(。对于这种操作,+的优先级最低,而(的优先级最高。当从栈弹出元素的工作完成后,我们再将操作符压入栈中。


 

猜你喜欢

转载自blog.csdn.net/qq_34536551/article/details/83654687