0

我的任务是使用堆栈评估一个完全带括号的中缀表达式。已为我编写了 Stack 类,我不能更改或修改 Stack 类。

以下是如何评估中缀表达式的分步说明:

只需从左到右扫描表达式。如果它不是a ),则将其压入堆栈。当您遇到 a ) 时,从堆栈中弹出 4 次,进行数学运算并将值压入堆栈。最后,您将在堆栈中只有一个值,这就是答案。

这是该代码:

class Stack:

    def __init__(self):
        self.theStack=[]

    def top(self):

        if self.isEmpty():
            return "Empty Stack"
        else:
            return self.theStack[-1]

    def isEmpty(self):
        return len(self.theStack)==0

    def push(self,item):
        self.theStack.append(item)

    def pop(self):
        if not self.isEmpty():
            temp=self.theStack[-1]
            del(self.theStack[-1])
            return temp

        else:
            return "Empty Stack"

到目前为止,这是我的代码:

def evaluateInfix(Input):

    xStack=Stack()

    for n in Input:
        if n!=")":
            print "Pushing %s into the stack" %n
            xStack.push(n)

        if n==")":
            math=xStack.pop()+xStack.pop()+xStack.pop()

            last=xStack.pop()

            for j in math:

                print "    Popping %s from stack" %j

            print "    Popping %s from stack" %last

            evaluation=eval(math)

            xStack.push(evaluation)

            print "Pushing %d into stack" %evaluation

这是我的代码运行的示例:

Enter a fully parenthesized expression that has non-negative integer operands and using            only + - * and ( )
Please enter the expression: ((9+9)+(9+9))
Pushing ( into the stack
Pushing ( into the stack
Pushing 9 into the stack
Pushing + into the stack
Pushing 9 into the stack
    Popping 9 from stack
    Popping + from stack
    Popping 9 from stack
    Popping ( from stack
    Pushing 18 into stack
Pushing + into the stack
Pushing ( into the stack
Pushing 9 into the stack
Pushing + into the stack
Pushing 9 into the stack
    Popping 9 from stack
    Popping + from stack
    Popping 9 from stack
    Popping ( from stack
Pushing 18 into stack
Traceback (most recent call last):
  File "project2.py", line 252, in <module>
    main()
  File "project2.py", line 246, in main
    Infix=evaluateInfix(Input)
  File "project2.py", line 164, in evaluateInfix
    math=xStack.pop()+xStack.pop()+xStack.pop()
TypeError: unsupported operand type(s) for +: 'int' and 'str'
4

3 回答 3

0

问题是在您的代码中,两组 '9+9' 在 eval 中被评估为字符串,然后作为integers放回堆栈。(见下文)

theStack=['(', 18, '+', 18]

因此,在代码行中:

math=xStack.pop()+xStack.pop()+xStack.pop()

它尝试连接两个整数(18 和 18)和一个字符串('+'),由于它们是不兼容的类型,因此会产生错误。如果您将此行更改为:

math=str(xStack.pop())+str(xStack.pop())+str(xStack.pop())

因此,将所有内容强制为一种类型,字符串,它应该可以正常工作。

于 2013-07-15T07:03:34.923 回答
0

我认为问题在于你没有决定你不想把什么放在你的堆栈上。有数字或字符串吗?我不认为这是最好的解决方案(你显然在做一些课堂作业,我不想给你解决方案),但如果你决定只放字符串,你只需要替换:

xStack.push(evaluation)

经过

xStack.push(str(evaluation))

但正如评论中已经说过的,您可能不应该使用 eval 并将整数和运算符放在堆栈上。

于 2013-07-14T20:43:59.190 回答
0

我希望这对你有帮助

看要点

于 2013-08-25T11:48:33.410 回答