[SWEA] 4874 forth


質問元:[SWEA] 4874 forth
learn -> course -> programming intermediate -> stack2 -> forth

質問する


Forthというコンピュータ言語はスタック演算に基づいて接尾辞表現を用いる.例えば、3+4は以下のように表される.
3 4 + .
Forthでは、次のように動作します.
スタックに数字を配置します.
演算子に遭遇した場合、スタック内の2つの数値を加算し、結果をスタックに再配置します.
‘.’スタックから数値を取り出して出力します.
Forthコードの計算結果を出力するプログラムを作成します.フォーマットが間違って演算できない場合は「error」を出力します.

入力


第1行は、試験用例数Tを与える.1≤T≤50
次の行から、テスト例の各整数および演算子には256文字以内の演算コードが付与されます.演算子と演算子はスペースで区切られ、コードは「.」で終了します.
除法の場合はいつも分かれている.

しゅつりょく


#と1番から始まるテストケース番号、スペースの後、計算結果を整数またはerrorに出力します.

コード#コード#

# 후위표기식 계산 함수
def forth(lst):
    stack = []      # 계산 결과를 담을 리스트 초기화

    # 후위표기식을 순회하면서 계산
    for i in range(len(lst)):
        if lst[i] == '.':       # i가 '.'일 때 스택의 길이가 1이면 스택의 값을 return 해줌
            if len(stack) == 1:
                return stack.pop()
            else:               # 그렇지 않을 경우 올바른 식이 아니므로 return error
                return 'error'

        # stack에 숫자가 2개 미만으로 있는 경우 lst[i]가 연산자이면 error 숫자면 append
        elif len(stack) < 2:
            if lst[i] == '+' or lst[i] == '-' or lst[i] == '*' or lst[i] == '/':
                return 'error'
            else:
                stack.append(int(lst[i]))
        else:
            # 연산자 별로 숫자 2개를 pop해서 계산 후 다시 append
            if lst[i] == '+':
                b = stack.pop()
                a = stack.pop()
                stack.append(a + b)
            elif lst[i] == '-':
                b = stack.pop()
                a = stack.pop()
                stack.append(a - b)
            elif lst[i] == '*':
                b = stack.pop()
                a = stack.pop()
                stack.append(a * b)
            elif lst[i] == '/':
                b = stack.pop()
                a = stack.pop()
                stack.append(a // b)
            else:                   # 연산자가 아닐 경우 숫자, int로 변환해서 넣어줌
                stack.append(int(lst[i]))


T = int(input())
for tc in range(1, T + 1):
    calc_list = list(input().split())   # 계산할 수식을 리스트로 받아옴

    print(f'#{tc} {forth(calc_list)}')

解答方法


接尾辞式を計算する関数を作って解いた.まず終了条件を書いて、それからエラーが発生した条件を書きました.最後にelse文は演算子をチェックし、演算結果をスタックに追加します.