抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

前缀、中缀、后缀表达式(逆波兰表达式)

前缀表达式(波兰表达式)

一、基本概念

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

(2)举例说明:(3+4)* 5 - 6对应的前缀表达式就是 - * + 3 4 5 6。



二、前缀表达式的计算机求值

​ 从右向左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时没弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素和次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。

例如:(3+4)*5-6对应的前缀表达式就是 - * + 3 4 5 6,针对前缀表达式求值步骤如下:

(1)从右至左扫描,将6、5、4、3压入堆栈;

(2)遇到+运算符,因此弹出3和4,计算得到结果7,将结果压入栈;

(3)接下来是*运算符,因此弹出7和5,计算得到35,将结果入栈;

(4)最后是-运算符,计算35 - 6 = 29的结果,此时29就是表达式的最后结果。





中缀表达式

一、基本概念

(1)中缀表达式就是常见的运算表达式,如(3+4)*5-6;

(2)中缀表达式的求值是人所最熟悉的,但是对于计算机却不好操作,因此在计算结果时,往往会将中缀表达式转成其它表达式来操作(一般转为后缀表达式)。



二、中缀表达式转后缀表达式思路

(1)初始化两个栈:运算符栈s1和存储中间结果的栈s2;

(2)从左至右扫描中缀表达式;

(3)遇到操作数时,将其压入s2;

(4)遇到操作符时,比较其与s1栈顶运算符的优先级:

  • 如果s1为空或栈顶运算符为左括号”(“,则直接将此运算符入栈;
  • 否则,若优先级比栈顶的优先级高,也将运算符压入栈s1;
  • 否则将s1栈顶的运算符弹出并压入到s2中,再次转到第一步与s1中新的栈顶运算符相比较。

(5)遇到括号时:

  • 如果是左括号”(“,则直接压入s1
  • 如果是右括号”)“,则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃。

(6)重复步骤2至5,直到表达式的最右边

(7)将s1中剩余的运算符依次弹出并压入s2;

(8)依次弹出s2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式。





后缀表达式(逆波兰表达式)

一、基本概念

(1)后缀表达式又称为逆波兰表达式,与前缀表达式相似,只是运算符位于操作数之后;

(2)举例说明:(3+4)* 5 - 6对应的后缀表达式就是3 4 + 5 * 6 - 。

正常的表达式 逆波兰表达式
a + b a b +
a + ( b - c ) a b c - +
a + ( b - c ) * d a b c - d * +
a + d * ( b - c ) a d b c - * +
a = 1 + 3 a 1 3 + =


二、后缀表达式的计算机求值

从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算,并将结果入栈;重复上述过程知道表达式最右端,最后运算得出的值即为表达式的结果

例如:(3+4)* 5 - 6对应的前缀表达式就是3 4 + 5 * 6 -,针对后缀表达式求值步骤如下:

(1)从左至右扫描,将3和4压入堆栈;

(2)遇到+运算符,因此弹出3和4,计算得到3+4的结果,再将7入栈;

(3)将5入栈;

(4)接下来是*运算符,因此弹出5和7计算出结果并将结果入栈;

(5)将6入栈;

(6)最后是-运算符,计算35 - 6的结果,此时最后的结果是29。



三、逆波兰计算器

1、需求

  • 输入一个逆波兰表达式(后缀表达式),使用栈(Stack),计算其结果
  • 支持小括号和多位数整数


评论