0

スタックを使用して中置式を評価する関数があります。(これまでに見たことがないに違いありません。) これはリスト形式の式を取り、リスト内の各項目は単一の文字 (オペランド、演算子、または括弧) です。

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の前に飛び出します!スタックについて、または私が書いたことについて、私は何を誤解していますか?

4

1 に答える 1