中缀表达式转换为前缀形式
- 为方便观察,数字以ABCD命名。
- 运算符只有加减乘除。
- 运算符之前的两位数字是中缀表达式中运算符连接的两位数字。如果运算符是连续的,那么右边的运算符先于左边的运算符进行计算
- 实际上,括号打破了“加减乘除”运算的优先级规律,所以应当先思考无括号的情况,后思考有括号的情况。
- 假设有两个栈,栈op存放操作符,栈num存放数字。
只考虑无括号
同一运算优先级
设eq=A + B + C + D
已知转换结果为+ + + A B C D
分析可知,按照中缀表达式的思路,先进行了 A + B ,后进行了 ( A + B ) +C,最后进行了 ( ( A + B ) +C ) + D。
那么
次数 | op | num |
---|---|---|
1 | PUSH D | |
2 | PSUH + | |
3 | PUSH C | |
4 | PSUH + | |
5 | PUSH B | |
6 | PSUH + | |
7 | PSUH A |
最终
op | num |
---|---|
A | |
+ | B |
+ | C |
+ | D |
可以发现,将op逐一取出并放在num的栈顶,最后的结果是符合中缀表达式的思路的。
不同运算优先级
设eq=A + B * C
已知转换结果为+ A * B C
如果按照之前的做法,那么
即( A + B ) * C
*的优先级被忽视
为了体现运算符的优先级,高运算符应当紧贴对应连接的数字
考虑有括号
括号的作用在于提高了括号内的运算符的优先级,也就是说从右向左遍历,当遇到右括号时,将其压入op栈,当遇到左括号时,需要逐次取出op栈的栈顶元素并将其压入num栈,直到取出右括号。
当然括号内的运算式也需要符合【不同运算优先级】的规律。
代码实现
简单定义栈
class Stack():
def __init__(self):
self.items=[]
def push(self,item):
self.items.append(item)
return self.items
def pop(self):
return self.items.pop()
def peek(self) :
return self.items[-1]
def isEmpty(self):
return self.items==[]
def size(self):
return len( self.items