白駿1918号:後列表記式


後記式


白駿1918号:後列表記式

アイデア

  • 各演算子の優先度を定義します(かっこ->除算->増減)
  • は演算子によって直ちに出力される.
  • 左括弧に遭遇した場合、スタックにプッシュします.
  • 閉じた括弧に遭遇した場合、スタックに積み重ねられた演算子が、ペアの左括弧に遭遇するまでポップアップされます.
  • スタックの上部にある演算子が現在の演算子の優先度と同じである場合、スタックの上部にある演算子がポップアップされ、現在の演算子がプッシュされます.
  • 現在の演算子の優先度がスタック上部の演算子(乗算後加算)より低い場合、スタックされた演算子がカッコに遭遇する前にポップアップされ、現在の演算子がプッシュされます.
  • コード#コード#

    import sys
    input = sys.stdin.readline
    
    infix = input().rstrip() + ')'
    dic = {'(': 0, '*': 1, '/': 1, '+': 2, '-': 2}
    stack = ['(']
    
    i = 0
    while stack:
        if infix[i].isalpha():
            print(infix[i], end='')
        elif infix[i] == '(':
            stack.append('(')
        elif infix[i] == ')':
            while stack and stack[-1] != '(':
                print(stack.pop(), end='')
            stack.pop()
        else:  # + - * /
            if dic[infix[i]] == dic[stack[-1]]:
                print(stack.pop(), end='')
            elif dic[infix[i]] > dic[stack[-1]]:
                while stack[-1] != '(':
                    print(stack.pop(), end='')
            stack.append(infix[i])
        i += 1

    おしゃべり


    去年の初めに資料の構造を勉強したときにCで作ったのを覚えています.思い出が目に浮かぶ.