问题描述
中缀表达式: 形式为op b的表达式。当运算符位于每对操作数之间时。
后缀表达式: 形式为b op的表达式。每对操作数都跟随一个运算符。
为什么用表达式的后缀表示?
编译器从左到右或从右到左扫描表达式。
考虑以下表达式:
a op1 b op2 c op3 d
If op1 = +,op2 = *,op3 = +
编译器首先扫描表达式以求表达式b * c,然后再次扫描表达式以为其添加a。然后将结果添加到另一次扫描后的d
我的解决方案:
class Stack():
# defining the attributes
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def size(self):
return len(self.items)
def push(self,item):
self.items.append(item)
def pop(self):
if not(self.isEmpty()):
return self.items.pop()
else:
return "UNDERFLOW"
def peek(self):
return self.items[len(self.items)-1]
def InfixToPostfix(s):
precedence_dict = {'+':1,'-':1,'*':2,'/':2,'^':3}
output = []
stack1 = Stack()
for char in s:
if not char in precedence_dict:
output.append(char)
elif char == '(':
stack1.push(char)
elif char == ')':
while stack1.peek() != '(':
output.append(stack1.pop())
if stack1.peek() == '(':
stack1.pop()
else:
if stack1.isEmpty() == True:
stack1.push(char)
else: # two conditons if input_pre > top or top_pre > input_prece
precendence_input = precedence_dict[char]
precendence_top = precedence_dict[stack1.peek()]
if precendence_input > precendence_top:
stack1.push(char)
elif precendence_input <= precendence_top:
while stack1.peek() != char:
output.append(stack1.pop())
if stack1.isEmpty():
stack1.push(char)
else:
precendence_top = precedence_dict[stack1.peek()]
precendence_input = precedence_dict[char]
if precendence_input > precendence_top:
stack1.push(char)
else:
output.append(stack1.pop())
if stack1.isEmpty():
stack1.push(char)
else:
precendence_top = precedence_dict[stack1.peek()]
for _ in range(stack1.size()):
output.append(stack1.pop())
print("".join(output))
InfixToPostfix('K+L-M*N+(O^P)*W/U/V*T+Q')
输出:
KL+-MN*-(OP)^W*UV/T*+Q+
正确的输出:
KL+MN*-OP^W*U/V/T*+Q+
此代码有什么问题?
这对于没有任何括号的简单输入工作正常,但对于包含括号的输入则无效。另外,输出如何包含(
和)
?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)