中缀转后缀实现的主要思路是:
新建一个空list。给各运算符指定优先级。当输入为运算量是数字时加入list中当输入为左括号 ‘(’ 时入栈。当输入运算符的优先级小于栈内运算符的优先级时,执行出栈操作,存入list中,直到栈为空或栈内的运算符优先级小于输入运算符的优先级。当输入为右括号 ‘)’ 时,执行出栈操作,存入list中,直到遇到左括号 ‘(’ 才停止操作。通过后缀表达式计算式子时,遍历整个式子,如果遍历到数字则入栈,如果为运算符则连续执行两次出栈操作,然后将计算结果再次入栈,直到最后栈内只有一个最终结果。
import re class MyStack(): def __init__(self): self.items = [] def push(self, item): return self.items.append(item) def pop(self): return self.items.pop() def size(self): return len(self.items) def peek(self): return self.items[len(self.items)-1] def display(self): print(self.items) def infix_to_postfix(s): prec = { '*':3, '/':3, '+':2, '-':2, '(':1 } a = list(input('请输入中缀表达式:')) postfix = [] for x in a: if re.match('[a-zA-Z0-9]', x): postfix.append(x) else: if x == '(': s.push(x) elif x == ')': while True: a = s.pop() if a == '(': break else: postfix.append(a) else: while s.size() > 0 and prec[x] <= prec[s.peek()]: postfix.append(s.pop()) s.push(x) for _ in range(s.size()): postfix.append(s.pop()) return postfix def cal_postfix(s, postfix): for x in list(postfix): if re.match('[0-9]', x): s.push(x) else: a1 = int(s.pop()) a2 = int(s.pop()) if x == '*': a = a1 * a2 elif x == '/': a = a2 / a1 elif x == '+': a = a1 + a2 else: a = a2 - a1 s.push(a) return s.pop() if __name__ == '__main__': s = MyStack() postfix = infix_to_postfix(s) print('后缀表达式:', postfix) postfix = '78+32+/' postfix_val = cal_postfix(s, postfix) print('后缀表达式计算结果:', postfix_val)