前缀、中缀和后缀表达式的区别与转换

一、前缀表达式

前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前

1、求前缀表达式计算值的步骤:

(1)从右到左扫描表达式,遇到数字时直接入栈,遇到运算符时弹出栈顶两个数;
(2)根据运算符对两个数进行相应计算(栈顶元素 op 次顶元素),并将计算结果入栈;
(3)重复上述过程直至表达式的最左端,剩余最后一个数在栈中弹出即为最终计算结果。

现以(3+4)×5-6 为例,其对应的前缀表达式就是 - × + 3 4 5 6。

(1) 从右至左扫描”- × + 3 4 5 6“,将数字6、5、4、3压入栈;
(2) 遇到+运算符,弹出3和4(3为栈顶元素,4为次顶元素,注意与后缀表达式做比较),计算出3+4=7,将7入栈;
(3) 遇到×运算符,弹出7和5,计算出7×5=35,将35入栈;
(4) 最后遇到-运算符,计算出35-6=29,即为最终结果。

2、将中缀表达式转换为前缀表达式

(1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2;
(2) 从右至左扫描中缀表达式;
(3) 遇到操作数时,将其压入S2;
(4) 遇到运算符时,比较其与S1栈顶运算符的优先级:
(4-1) 如果S1为空,或栈顶运算符为右括号“)”,则直接将此运算符入栈;
(4-2) 否则,若优先级比栈顶运算符的较高或相等,也将运算符压入S1;
(4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较;
(5) 遇到括号时:
(5-1) 如果是右括号“)”,则直接压入S1;
(5-2) 如果是左括号“(”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到右括号为止,此时将这一对括号丢弃;
(6) 重复步骤(2)至(5),直到表达式的最左边;
(7) 将S1中剩余的运算符依次弹出并压入S2;
(8) 依次弹出S2中的元素并输出,结果即为中缀表达式对应的前缀表达式。

将中缀表达式“1+((2+3)×4)-5”转换为前缀表达式的过程如下:
前缀、中缀和后缀表达式的区别与转换_第1张图片

二、中缀表达式

中缀表达式是一种通用的算术或逻辑公式表示方法,运算符处于操作数的中间,中缀表达式是人们常用的算术表示方法。

虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值。对计算机来说,计算前缀或后缀表达式的值非常简单

(3+4)×5-6 即为一个中缀表达式。

三、后缀表达式

后缀表达式又称逆波兰表达式,与前缀表达式相似,但运算符位于操作数之后

1、求后缀表达式计算值的步骤:

(1)从左到右扫描表达式,遇到数字时直接入栈,遇到运算符时弹出栈顶两个数;
(2)根据运算符对两个数进行相应计算(次顶元素 op 栈顶元素),并将计算结果入栈;
(3)重复上述过程直至表达式的最右端,剩余最后一个数在栈中弹出即为最终计算结果。

现以(3+4)×5-6 为例,其对应的前缀表达式就是3 4 + 5 × 6 -。

(1) 从左至右扫描“3 4 + 5 × 6 -”,将3和4压入栈;
(2) 遇到+运算符,弹出4和3(4为栈顶元素,3为次顶元素,注意与前缀表达式做比较),计算出3+4=7,将7入栈;
(3) 将5入栈;
(4) 遇到×运算符,弹出5和7,计算出7×5=35,将35入栈;
(5) 将6入栈;
(6) 最后遇到-运算符,计算出35-6=29,即为最终结果。

2、将中缀表达式转换为后缀表达式

(1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2;
(2) 从左至右扫描中缀表达式;
(3) 遇到操作数时,将其压入S2;
(4) 遇到运算符时,比较其与S1栈顶运算符的优先级:
(4-1) 如果S1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;
(4-2) 否则,若优先级比栈顶运算符的高,也将运算符压入S1(注意转换为前缀表达式时是优先级较高或相同,而这里则不包括相同的情况);
(4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较;
(5) 遇到括号时:
(5-1) 如果是左括号“(”,则直接压入S1;
(5-2) 如果是右括号“)”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到左括号为止,此时将这一对括号丢弃;
(6) 重复步骤(2)至(5),直到表达式的最右边;
(7) 将S1中剩余的运算符依次弹出并压入S2;
(8) 依次弹出S2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式(转换为前缀表达式时不用逆序)。

将中缀表达式“1+((2+3)×4)-5”转换为后缀表达式的过程如下:
前缀、中缀和后缀表达式的区别与转换_第2张图片

你可能感兴趣的:(数据结构,编译原理,数据结构,前缀/中缀/后缀表达式,逆波兰表达式)