[SWEA] 4874 forth
質問元:[SWEA] 4874 forth
learn -> course -> programming intermediate -> stack2 -> 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文は演算子をチェックし、演算結果をスタックに追加します.
Reference
この問題について([SWEA] 4874 forth), 我々は、より多くの情報をここで見つけました
https://velog.io/@yujin19/SWEA-4874-forth
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
# 후위표기식 계산 함수
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)}')
Reference
この問題について([SWEA] 4874 forth), 我々は、より多くの情報をここで見つけました https://velog.io/@yujin19/SWEA-4874-forthテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol