后缀的中缀:带括号的输入的输出不正确

问题描述

中缀表达式: 形式为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 (将#修改为@)