中缀表达式与后缀表达式的转换和计算
目录
中缀表达式转换为后缀表达式的实现方式为:
- 依次获取中缀表达式的元素,
- 若元素为操作数(数字/字母等),则加入后缀表达式中
- 若元素为操作符,则压入栈中,此时对比入栈操作符与栈内元素的计算等级,等级大于或等于入栈元素的栈内操作符都将被弹出栈,加入到后缀表达式中
- 左括号直接入栈,优先级最高,不弹出栈内元素
- 右括号不入栈,而是弹出所有元素加入后缀表达式,直至遇见匹配的左括号,并弹出左括号但不加入后缀表达式中
- 当中缀表达式的元素耗尽后,依次弹出栈内元素加入到后缀表达式中。
代码实现过程如下,
完整代码
1 from linked_list_stack import Stack 2 3 SIGN = {'+': 1, '-': 1, '*': 2, '/': 2, '(': 3} 4 5 6 def infix_to_postfix(expr): 7 global SIGN 8 out = [] 9 s = Stack() 10 for i in expr: 11 if i in SIGN.keys(): 12 # Pop all high level sign except left bracket 13 while s.top(): 14 if SIGN[s.top()] < SIGN[i] or s.top() == '(': 15 break 16 out.append(s.pop()) 17 # Push sign 18 s.push(i) 19 elif i == ')': 20 # Pop all sign until left bracket encountered 21 while s.top() != '(': 22 out.append(s.pop()) 23 # Pop left bracket 24 s.pop() 25 else: 26 # Push number 27 out.append(i) 28 29 while s.top(): 30 out.append(s.pop()) 31 return out 32 33 34 if __name__ == '__main__': 35 ep = 'a + b * c + ( d * e + f ) * g' 36 print(' '.join(infix_to_postfix(ep.split(' '))))