关于四则表达式,网上资料很多,不重复
本篇使用栈实现后缀表达式转前缀表达式
本篇使用栈实现后缀表达式转前缀表达式
1 定义栈类
栈是一个定义在一端操作的线性表,last-out-first-in(LOFI)的特点
<span style="font-size:18px;">class Stack:
"""定义栈"""
def __init__(self):
self.items = []
#判断是否栈空
def isEmpty(self):
return len(self.items)==0
#进栈操作
def push(self, item):
self.items.append(item)
#出栈操作
def pop(self):
return self.items.pop()
#查看栈顶元素
def peek(self):
if not self.isEmpty():
return self.items[len(self.items)-1]
#栈的大小
def size(self):
return len(self.items)</span>
2 中缀表达式转前缀
def infix(expression): signStack = Stack()#操作符栈 result = []#输出结果 # 从右到左扫描表达式 for element in expression[::-1]: # (1)如果遇到操作数,放入输出结果list中 if element in 'QWERTYUIOPASDFGHJKLZXCVBNM': result.append(element) # (2)遇到右括号,放入操作符栈中 elif element is ')': signStack.push(element) # (3)遇到左括号,取出操作符栈的栈顶元素 # -如果栈顶元素是右括号,就丢掉这一对括号 # -否则就不停地取栈顶元素,放入输出结果list中 elif element is '(': gettop = signStack.pop() while gettop != ')': print 'size'+str(signStack.size()) print 'element'+gettop result.append(gettop) gettop = signStack.pop() print 'element-------'+gettop # (4)遇到操作符 # -如果操作符栈为空,就入栈 # -否则就把该操作符与操作符栈的栈顶元素比较优先级 # -如果该操作符优先级高或者遇到有括号,直接入操作符栈 # -否则就不停取出栈顶元素,放入输出结果list中 else: if signStack.isEmpty() : signStack.push(element) else: while not signStack.isEmpty() : top = signStack.peek() if top is not')': if opSort(element,top) is 'big': signStack.push(element) break else: get = signStack.pop() result.append(get) else: signStack.push(element) break else: signStack.push(element) while not signStack.isEmpty(): result.append(signStack.pop()) return result[::-1]
操作符优先级比较函数:
def opSort(op1,op2): priority={'*':3,'/':3,'-':2,'+':2} if priority[op1] < priority[op2]: return 'small' else: return 'big'
简单测试:
<span style="font-size:18px;">print infix('((A+(B*C))-(D+E))')</span>
输出结果:
['-', '+', 'A', '*', 'B', 'C', '+', 'D', 'E']