目录
中缀表达式就是我们数学中常用的那种表达式,本文打算以中缀表达式:1 + (2 + 3) × 4 - 5 为例,分享一下前缀表达式和后缀表达式的如何形成与在计算机如何计算前后最表达式和后缀表达式
1、前缀表达式和后缀表达式的形成
前缀表达式和后缀表达式中的这个“缀”就是指符号的移动方向(通俗来说,就是符号统一朝哪边靠)
前缀表达式和后缀表达式形成都是对于整个中缀表达式按照运算顺序见运算符就加括号,保证每个运算符外面一定要有括号(原本有就没必要加了),然后每个符号挪到自己那层括号的外面(前缀是前面,后缀是后面),然后去掉括号。
中缀表达式:1 + (2 + 3) × 4 - 5
((1 +((2 + 3) × 4))- 5)
前缀表达式:- (+(1 ×(+(2 3) 4))5),去掉括号得: - +1×+2345
后缀表达式: ((1 ((2 3) + 4)×)+5)-,去掉括号得: 123+4×+5-
这样前缀表达式和后缀表达式就出来了。
那如何在机器层面将中缀表达式变成后缀表达式和前缀表达式
1.1、中缀表达式转前缀表达式
1)设置一个符号栈S,一个数字栈D
2)从中缀表达式右边开始遍历
3)遇到数字,压入数字栈D
遇到右括号,压入符号栈S
遇到运算符,如果符号栈栈顶为右括号,当前运算符直接入符号栈
如果符号栈栈顶运算符优先级小于等于当前运算符,当前运算符也直接入符号栈
如果符号栈栈顶运算符优先级大于当前运算符,那就栈顶元素出栈然后入栈数字栈,接着继续比较,直 到栈顶元素为右括号或者优先级小于等于当前运算符的运算符。
遇到左括号,符号栈开始出栈,出栈元素依次进入数字栈,直到遇见右括号为止(右括号不入数字栈,和左括号一起删掉)
图示过程如下(中缀表达式:1 + (2 + 3) × 4 - 5):
1.2、中缀表达式转后缀表达式
1、设置一个符号栈S,一个队列Q
2、从中缀表达式左边开始遍历
3、遇到数字,入队列D
遇到左括号,压入符号栈S
遇到运算符,如果符号栈栈顶为左括号,当前运算符直接入符号栈
如果符号栈栈顶运算符优先级小于当前运算符,当前运算符也直接入栈
如果符号栈栈顶运算符优先级大于等于当前运算符,那就栈顶元素出栈然后入栈数字栈,接着继续比较,直 到栈顶元素为右括号或者优先级小于当前运算符的运算符。
遇到右括号括号,符号栈开始出栈,出栈元素依次进入数字栈,直到遇见左括号为止(右括号不入队列,和左括号一起删掉)
图示过程如下(中缀表达式:1 + (2 + 3) × 4 - 5):
1.3、注意点 (重点)
中缀表达式转前缀表达式的时候,在比较运算符的优先级的时候,同优先级的不出栈
中缀表达式转后缀表达式的时候,在比较运算符的优先级的时候,同优先级的出栈
是因为前缀表达式是从后往前去解析,同优先级下先入栈的应该后运算,所以不需要出栈(判断是大于即可),后面一起出栈是为了保证按照原本顺序运算。
而后缀表达式本身顺序就是按照从前往后解析,同优先级下先入栈的应该先出栈运算,所以需要出栈(是判断大于等于才行)。
2、前缀表达式和后缀表达式在计算机中如何计算。
2.1、计算前缀表达式的值
前缀表达式: - +1×+2345。前缀表达式从后向前读取表达式,遇到数字就压入栈,遇到符号就弹出两个数字用当前运算符进行操作。
- +1×+2345
剩余表达式 | 当前元素 | 栈 | 值 |
- +1×+234 | 5 | 5 | NULL |
- +1×+23 | 4 | 45 | NULL |
- +1×+2 | 3 | 345 | NULL |
- +1×+ | 2 | 2345 | NULL |
- +1× | + | 45 | 2+3 = 5 |
- +1 | × | 5 | 5*4 = 20 |
- + | 1 | 15 | 20 |
- | + | 5 | 20+1= 21 |
- | 21-5 = 16 | ||
2.2、计算后缀表达式的值
后缀表达式: 123+4×+5-。后缀表达式从前向后读取表达式,遇到数字就压入栈,遇到符号就弹出两个数字用当前运算符进行操作。
你,总要埋头去做一些事情,不是吗