前缀、中缀、后缀表达式(逆波兰表达式)
前缀表达式(波兰表达式)
一、基本概念
(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),计算其结果
- 支持小括号和多位数整数