# 입력을 받아서 공백을 제거하고 리스트로 변환하는 함수
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()

+ Recent posts