우리는 위와 같은 중위표기식을 보면, 한 번에 수식 내에서의 우선순위를 고려하며 계산을 할 수 있습니다. 그래서 바로 라는 답을 찾을 수 있습니다.
💻 : 이고, 엇? 곱하기가 먼저라 로 계산하면 안되네?😭
하지만 컴퓨터는 앞에서부터 하나씩 읽어가면서 수식을 확인하기 때문에 우선순위에 따라 계산 순서가 달라지는 중위표기식은 구현하기 매우 복잡해집니다.
따라서 컴퓨터는 사람이 작성한 중위표기법을 전위/후위표기법으로 변환한 뒤 계산을 하게 됩니다.
수식 표기법의 변환과 후위 표기법에서 계산을 할 때는 모두 스택을 사용합니다.
저는 후위표기법을 중심으로 설명하도록 하겠습니다.
pop
한 뒤 새로 들어온 연산자를 push
해줍니다. (
가 들어오면, 스택에 push
합니다. )
가 들어오면, 스택에서 (
가 나올 때까지 모두 pop
해줍니다. pop
해줍니다. 👩🏫 : 를 후위 표기법으로 바꿔보자!
변환 결과 :
push
합니다. 👩🏫 : 를 중위 표기법으로 바꿔보자!
변환 결과 :
후위 표기법은 스택을 사용하여 앞에서부터 읽어가면서 쉽게 계산을 할 수 있습니다.
push
합니다. pop
하여 연산한 뒤 그 결과를 다시 스택에 push
합니다. 👩🏫 : 를 계산해보자!
import sys
expressions = sys.stdin.readline().strip()
stack = []
# 각 연산자 별 우선순위가 높거나 같은 연산자 모음 딕셔너리
op = {'+': ['+', '-', '*', '/'], '-': ['+', '-', '*', '/'], '*': ['*', '/'], '/': ['*', '/']}
# 각 연산자별 우선순위로, 아래와 같이 구현할 수도 있다.
# priority_map = {'+': 0, '-': 0, '*': 1, '/': 1, '(': -1}
for ex in expressions:
if ex.isalpha():
print(ex, end='')
elif ex == '(':
stack.append(ex)
elif ex == ')':
tmp = stack.pop()
while tmp != '(':
print(tmp, end='')
tmp = stack.pop()
else:
while stack and stack[-1] in op[ex]:
print(stack.pop(), end='')
stack.append(ex)
while stack:
print(stack.pop(), end='')
import sys
input = sys.stdin.readline
N = int(input())
expressions = input().strip()
nums = [int(input()) for _ in range(N)]
stack = []
for ex in expressions:
if ex.isalpha():
stack.append(nums[ord(ex) - 65])
else:
a, b = stack.pop(), stack.pop()
# result = eval(b + ops + a) #eval을 사용하여 계산할 수도 있다.
if ex == '+':
stack.append(b + a)
elif ex == '-':
stack.append(b - a)
elif ex == '*':
stack.append(b * a)
elif ex == '/':
stack.append(b / a)
print("%0.2f"%stack[-1])
[자료구조] 스택 응용 전위표기(PREFIX), 후위표기(POSTFIX), 중위표기(INFIX)
정처기 공부하던 중에 이해안되던 부분이었는데 덕분에 이해가 단숨에 되었습니다. 감사합니다.