微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决后缀的中缀:带括号的输入的输出不正确

中缀表达式: 形式为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 举报,一经查实,本站将立刻删除。