Python:我误解了堆栈逻辑,但我不知道在哪里

时间:2013-05-14 17:51:41

标签: python stack

我有一个通过使用堆栈来评估中缀表达式的函数。 (打赌你以前从未见过这个。)它采用列表格式的表达式,其中列表中的每个项目都是单个字符(操作数,运算符或括号。)

s = Stack()
tempvar = None
ops = ['+','-','/','*']

for i in expression:
    if i == '('
        s.push(i)

    elif i.isdigit():
        if tempvar is None:
            tempvar = i
        else:
            tempvar = tempvar + i

    elif i in ops:
        if tempvar is not None:
            s.push(tempvar)
            tempvar = None

        popped = str(s.pop() + str(s.pop())
        last = s.pop()
        if last is not ')':
            popped += str(last)

        for x in popped:
            print 'Popping',x,'from the stack.'

        print 'Popping',last,'from the stack.'

        math = eval(popped)
        s.push(math)
        print 'Pushing',math,'back onto the stack.

我使用“tempvar”字符串的意图是,因为我逐个字符地迭代表达式,所以我会遇到一个多位数的问题。所以我正在用它们制作一个字符串,然后把字符串推到堆栈上。

我遇到两个问题,我不知道为什么我会得到其中一个。

输入

((21*2)-(4/2))

我得到输出

Pushing ( onto the stack
Pushing ( onto the stack
Pushing 21 onto the stack
Pushing * onto the stack
Pushing 2 onto the stack
Popping 2 from the stack
**Popping * from the stack
Popping 2 from the stack
Popping 1 from the stack
Popping 21 from the stack**

我用星号引发了问题部分。我对堆栈的理解是它们的功能是后进先出,而且它们并不关心顶部是什么,pop会把它取下来。 21是我推入堆栈的第一件事,但它看起来像是单独阅读(21,最后一个弹出的条目)并分成两半为'2'和'1' - 但我希望1会在2之前弹出!我对堆栈或者我写的内容有什么误解?

1 个答案:

答案 0 :(得分:1)

for x in popped:
    print 'Popping',x,'from the stack.'

popped是一个字符串,因此这个循环将一次迭代一个字符。