スタックを使用して中置式を評価する関数があります。(これまでに見たことがないに違いありません。) これはリスト形式の式を取り、リスト内の各項目は単一の文字 (オペランド、演算子、または括弧) です。
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」文字列を使用する意図は、式を 1 文字ずつ反復しているため、複数桁の数字の問題が発生することです。そのため、それらから文字列を作成し、代わりに文字列をスタックにプッシュしています。
これには 2 つの問題がありますが、そのうちの 1 つを取得する理由がわかりません。
入力用
((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**
問題部分をアスタリスクで示しています。スタックについての私の理解では、スタックは後入れ先出しとして機能し、一番上に何があるかは気にせず、ポップがそれを取り除きます。スタックに最初にプッシュしたのは 21 でしたが、個別に読み取られ (21 として、最後にポップオフされるエントリ)、「2」と「1」として半分に分割されているように見えますが、1 は2の前に飛び出します!スタックについて、または私が書いたことについて、私は何を誤解していますか?