我有一个通过使用堆栈来评估中缀表达式的函数。 (打赌你以前从未见过这个。)它采用列表格式的表达式,其中列表中的每个项目都是单个字符(操作数,运算符或括号。)
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之前弹出!我对堆栈或者我写的内容有什么误解?
答案 0 :(得分:1)
for x in popped:
print 'Popping',x,'from the stack.'
popped
是一个字符串,因此这个循环将一次迭代一个字符。