# 입력을 받아서 공백을 제거하고 리스트로 변환하는 함수
def get_input():
expression = input("계산식을 입력하세요: ")
expression = expression.replace(" ", "")
return list(expression)
# 연산자의 우선순위를 반환하는 함수
def get_priority(operator):
if operator == "+" or operator == "-":
return 1
elif operator == "*" or operator == "/":
return 2
elif operator == "(" or operator == ")":
return 0
# 두 수와 연산자를 받아서 계산하는 함수
def calculate(num1, num2, operator):
if operator == "+":
return num1 + num2
elif operator == "-":
return num1 - num2
elif operator == "*":
return num1 * num2
elif operator == "/":
return num1 / num2
# 후위 표기법으로 변환하는 함수
def to_postfix(expression):
postfix = [] # 후위 표기법으로 변환된 결과를 저장할 리스트
stack = [] # 연산자를 임시로 저장할 스택
for token in expression:
if token.isdigit(): # 토큰이 숫자이면 결과 리스트에 바로 추가
postfix.append(token)
else: # 토큰이 연산자이면
if token == "(": # 여는 괄호이면 스택에 바로 추가
stack.append(token)
elif token == ")": # 닫는 괄호이면 스택에서 여는 괄호가 나올 때까지 결과 리스트에 추가하고 여는 괄호는 버림
while stack and stack[-1] != "(":
postfix.append(stack.pop())
stack.pop()
else: # 사칙연산자이면 스택에서 자신보다 우선순위가 높거나 같은 연산자들을 결과 리스트에 추가하고 자신을 스택에 추가
while stack and get_priority(token) <= get_priority(stack[-1]):
postfix.append(stack.pop())
stack.append(token)
while stack: # 스택에 남은 연산자들을 결과 리스트에 추가
postfix.append(stack.pop())
return postfix
# 후위 표기법으로 된 식을 계산하는 함수
def evaluate(postfix):
stack = [] # 피연산자를 임시로 저장할 스택
for token in postfix:
if token.isdigit(): # 토큰이 숫자이면 스택에 바로 추가
stack.append(int(token))
else: # 토큰이 연산자이면 스택에서 두 개의 피연산자를 꺼내서 계산하고 결과를 스택에 추가
num2 = stack.pop()
num1 = stack.pop()
result = calculate(num1, num2, token)
stack.append(result)
return stack.pop() # 스택에 남은 최종 결과를 반환
# 메인 함수
def main():
expression = get_input() # 입력을 받아서 리스트로 변환
postfix = to_postfix(expression) # 후위 표기법으로 변환
result = evaluate(postfix) # 계산
print("계산 결과는", result, "입니다.") # 출력
# 메인 함수 호출
main()
계산시예제
2023. 10. 25. 16:41