我有一个通过使用堆栈来评估中缀表达式的函数。(打赌你以前从未见过这个。)它采用列表格式的表达式,其中列表中的每个项目都是单个字符(操作数、运算符或括号。)
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之前弹出!我对堆栈或我所写的内容有什么误解?