Stack을 이용하여 infix notation을 postfix notation으로 변경하기
변경 방법
사용할 데이터와 자료구조
원본 입력 스트림 -> "입력스트림"
스택 1개 -> "스택"
최종 결과를 담을 리스트 -> "결과리스트"
알고리즘
사용자가 입력하는 수식을 의미 단위로 처리한다고 가정한다. (수, 연산자, 괄호 단위로 처리)
공백 문자는 무시한다.
사용자가 수를 입력한 경우 결과리스트에 넣는다.
스택이 비어있는 경우 스택에 push한다.
스택이 비어있지 않은 경우 pop하여 맨 뒤 토큰을 가져온다.
스택에서 뽑은 토큰이 사용자가 입력한 연산자와 같거나 높 계산 우선순위를 갖는 연산자이면 토큰을 결과리스트에 넣고 4번 과정을 다시 반복한다.
스택에서 뽑은 토큰이 사용자가 입력한 연산자보다 낮은 계산 우선순위를 갖는 연산자이면 토큰을 스택에 다시 push하고 사용자가 입력한 연산자를 스택에 push한다.
스택에서 뽑은 토큰이 여는 괄호이면 토큰을 스텍에 다시 push하고 사용자가 입력한 연산자를 스택에 push한다.
사용자가 괄호를 입력한 경우
여는 괄호일 경우 스택에 push한다.
닫는 괄호일 경우 스택에서 닫는 괄호와 쌍을 이루는 여는 괄호가 나올때까지 토큰을 pop하여 결과리스트에 넣는다. 이때 사용자가 입력한 닫는 괄호와 스택에서 pop한 쌍을 이루는 여는 괄호는 결과리스트에 넣지 않고 버린다.
입력스트림이 비워졌을 때 스택이 비어있지 않은 경우 스택의 모든 토큰을 하나씩 pop하여 결과리스트에 넣는다.
예시
연산자가 하나인 경우
# 문제
infix : 2 + 3
postfix : 2 3 +
# 풀이 (순서대로 원본스트림, 스택, 결과리스트)
[2, +, 3]
[]
[]
[+, 3]
[]
[2]
[3]
[+]
[2]
[]
[2, 3]
[+]
[]
[2, 3, +]
[]
같은 계산 우선순위를 가진 연산자가 2개 이상 있는 경우
# 문제
infix : 2 + 3 - 4
postfix : 2 3 + 4 -
# 풀이 (순서대로 원본스트림, 스택, 결과리스트)
[2, +, 3, -, 4]
[]
[]
[+, 3, -, 4]
[]
[2]
[3, -, 4]
[+]
[2]
[-, 4]
[+]
[2, 3]
[4]
[-]
[2, 3, +]
[]
[-]
[2, 3, +, 4]
[]
[]
[2, 3, +, 4, -]
# 문제
infix : 3 * 4 / 5
postfix : 3 4 * 5 /
# 풀이 (순서대로 원본스트림, 스택, 결과리스트)
[3, *, 4, /, 5]
[]
[]
[*, 4, /, 5]
[]
[3]
[4, /, 5]
[*]
[3]
[/, 5]
[*]
[3, 4]
[5]
[/]
[3, 4, *]
[]
[/]
[3, 4, *, 5]
[]
[]
[3, 4, *, 5, /]
높은 계산 우선순위를 가진 연산자가 먼저 오고 낮은 계산 우선순위를 가진 연산자가 나중에 오는 경우
# 문제
infix : 2 * 3 + 4
postfix : 2 3 * 4 +
# 풀이 (순서대로 원본스트림, 스택, 결과리스트)
[2, *, 3, +, 4]
[]
[]
[*, 3, +, 4]
[]
[2]
[3, +, 4]
[*]
[2]
[+, 4]
[*]
[2, 3]
[4]
[+]
[2, 3, *]
[]
[+]
[2, 3, *, 4]
[]
[]
[2, 3, *, 4, +]
낮은 계산 우선순위를 가진 연산자가 먼저 오고 높은 계산 우선순위를 가진 연산자가 나중에 오는 경우
# 문제
infix : 2 + 3 * 4
postfix : 2 3 4 * +
# 풀이 (순서대로 원본스트림, 스택, 결과리스트)
[2, +, 3, *, 4]
[]
[]
[+, 3, *, 4]
[]
[2]
[3, *, 4]
[+]
[2]
[*, 4]
[+]
[2, 3]
[4]
[+, *]
[2, 3]
[]
[+, *]
[2, 3, 4]
[]
[]
[2, 3, 4, *, +]
다른 계산 우선순위를 가진 연산자가 2개 이상 있는 경우
# 문제
infix : 2 + 3 * 4 - 5
postfix : 2 3 4 * + 5 -
# 풀이 (순서대로 원본스트림, 스택, 결과리스트)
[2, +, 3, *, 4, -, 5]
[]
[]
[+, 3, *, 4, -, 5]
[]
[2]
[3, *, 4, -, 5]
[+]
[2]
[*, 4, -, 5]
[+]
[2, 3]
[4, -, 5]
[+, *]
[2, 3]
[-, 5]
[+, *]
[2, 3, 4]
[5]
[-]
[2, 3, 4, *, +]
[]
[-]
[2, 3, 4, *, +, 5]
[]
[]
[2, 3, 4, *, +, 5, -]
# 문제
infix : 2 + 3 * 4 / 5 - 6
postfix : 2 3 4 * 5 / + 6 -
# 풀이 (순서대로 원본스트림, 스택, 결과리스트)
[2, +, 3, *, 4, /, 5, -, 6]
[]
[]
[+, 3, *, 4, /, 5, -, 6]
[]
[2]
[3, *, 4, /, 5, -, 6]
[+]
[2]
[*, 4, /, 5, -, 6]
[+]
[2, 3]
[4, /, 5, -, 6]
[+, *]
[2, 3]
[/, 5, -, 6]
[+, *]
[2, 3, 4]
[5, -, 6]
[+, /]
[2, 3, 4, *]
[-, 6]
[+, /]
[2, 3, 4, *, 5]
[6]
[-]
[2, 3, 4, *, 5, /, +]
[]
[-]
[2, 3, 4, *, 5, /, +, 6]
[]
[]
[2, 3, 4, *, 5, /, +, 6, -]
괄호가 포함된 복잡한 식의 경우
# 문제
infix : (7 + 3 - 6) + 5 * (4 / 2 + 1 - 9) + 13 / 5 * 21
postfix : 7 3 + 6 - 5 4 2 / 1 + 9 - * + 13 5 / 21 * +
# 풀이 (순서대로 입력스트림, 스택, 결과리스트)
[(, 7, +, 3, -, 6, ), +, 5, *, (, 4, /, 2, +, 1, -, 9, ), +, 13, /, 5, *, 21]
[]
[]
[7, +, 3, -, 6, ), +, 5, *, (, 4, /, 2, +, 1, -, 9, ), +, 13, /, 5, *, 21]
[(]
[]
[+, 3, -, 6, ), +, 5, *, (, 4, /, 2, +, 1, -, 9, ), +, 13, /, 5, *, 21]
[(]
[7]
[3, -, 6, ), +, 5, *, (, 4, /, 2, +, 1, -, 9, ), +, 13, /, 5, *, 21]
[(, +]
[7]
[-, 6, ), +, 5, *, (, 4, /, 2, +, 1, -, 9, ), +, 13, /, 5, *, 21]
[(, +]
[7, 3]
[6, ), +, 5, *, (, 4, /, 2, +, 1, -, 9, ), +, 13, /, 5, *, 21]
[(, -]
[7, 3, +]
[), +, 5, *, (, 4, /, 2, +, 1, -, 9, ), +, 13, /, 5, *, 21]
[(, -]
[7, 3, +, 6]
[+, 5, *, (, 4, /, 2, +, 1, -, 9, ), +, 13, /, 5, *, 21]
[]
[7, 3, +, 6, -]
[5, *, (, 4, /, 2, +, 1, -, 9, ), +, 13, /, 5, *, 21]
[+]
[7, 3, +, 6, -]
[*, (, 4, /, 2, +, 1, -, 9, ), +, 13, /, 5, *, 21]
[+]
[7, 3, +, 6, -, 5]
[(, 4, /, 2, +, 1, -, 9, ), +, 13, /, 5, *, 21]
[+, *]
[7, 3, +, 6, -, 5]
[4, /, 2, +, 1, -, 9, ), +, 13, /, 5, *, 21]
[+, *, (]
[7, 3, +, 6, -, 5]
[/, 2, +, 1, -, 9, ), +, 13, /, 5, *, 21]
[+, *, (]
[7, 3, +, 6, -, 5, 4]
[2, +, 1, -, 9, ), +, 13, /, 5, *, 21]
[+, *, (, /]
[7, 3, +, 6, -, 5, 4]
[+, 1, -, 9, ), +, 13, /, 5, *, 21]
[+, *, (, /]
[7, 3, +, 6, -, 5, 4, 2]
[1, -, 9, ), +, 13, /, 5, *, 21]
[+, *, (, +]
[7, 3, +, 6, -, 5, 4, 2, /]
[-, 9, ), +, 13, /, 5, *, 21]
[+, *, (, +]
[7, 3, +, 6, -, 5, 4, 2, /, 1]
[9, ), +, 13, /, 5, *, 21]
[+, *, (, -]
[7, 3, +, 6, -, 5, 4, 2, /, 1, +]
[), +, 13, /, 5, *, 21]
[+, *, (, -]
[7, 3, +, 6, -, 5, 4, 2, /, 1, +, 9]
[+, 13, /, 5, *, 21]
[+, *]
[7, 3, +, 6, -, 5, 4, 2, /, 1, +, 9, -]
[13, /, 5, *, 21]
[+]
[7, 3, +, 6, -, 5, 4, 2, /, 1, +, 9, -, *, +]
[/, 5, *, 21]
[+]
[7, 3, +, 6, -, 5, 4, 2, /, 1, +, 9, -, *, +, 13]
[5, *, 21]
[+, /]
[7, 3, +, 6, -, 5, 4, 2, /, 1, +, 9, -, *, +, 13]
[*, 21]
[+, /]
[7, 3, +, 6, -, 5, 4, 2, /, 1, +, 9, -, *, +, 13, 5]
[21]
[+, *]
[7, 3, +, 6, -, 5, 4, 2, /, 1, +, 9, -, *, +, 13, 5, /]
[]
[+, *]
[7, 3, +, 6, -, 5, 4, 2, /, 1, +, 9, -, *, +, 13, 5, /, 21]
[]
[]
[7, 3, +, 6, -, 5, 4, 2, /, 1, +, 9, -, *, +, 13, 5, /, 21, *, +]
# 문제
infix : 1 * 2 - 3 / [{(4 + 5) * 6} + 7 / 8] - (9 + (12 - 15) / 5)
postfix : 1 2 * 3 4 5 + 6 * 7 8 / + / - 9 12 15 - 5 / + -
# 풀이 (순서대로 입력스트림, 스택, 결과리스트)
[1, *, 2, -, 3, /, [, {, (, 4, +, 5, ), *, 6, }, +, 7, /, 8, ], -, (, 9, +, (, 12, -, 15, ), /, 5, )]
[]
[]
[*, 2, -, 3, /, [, {, (, 4, +, 5, ), *, 6, }, +, 7, /, 8, ], -, (, 9, +, (, 12, -, 15, ), /, 5, )]
[]
[1]
[2, -, 3, /, [, {, (, 4, +, 5, ), *, 6, }, +, 7, /, 8, ], -, (, 9, +, (, 12, -, 15, ), /, 5, )]
[*]
[1]
[-, 3, /, [, {, (, 4, +, 5, ), *, 6, }, +, 7, /, 8, ], -, (, 9, +, (, 12, -, 15, ), /, 5, )]
[*]
[1, 2]
[3, /, [, {, (, 4, +, 5, ), *, 6, }, +, 7, /, 8, ], -, (, 9, +, (, 12, -, 15, ), /, 5, )]
[-]
[1, 2, *]
[/, [, {, (, 4, +, 5, ), *, 6, }, +, 7, /, 8, ], -, (, 9, +, (, 12, -, 15, ), /, 5, )]
[-]
[1, 2, *, 3]
[[, {, (, 4, +, 5, ), *, 6, }, +, 7, /, 8, ], -, (, 9, +, (, 12, -, 15, ), /, 5, )]
[-, /]
[1, 2, *, 3]
[{, (, 4, +, 5, ), *, 6, }, +, 7, /, 8, ], -, (, 9, +, (, 12, -, 15, ), /, 5, )]
[-, /, []
[1, 2, *, 3]
[(, 4, +, 5, ), *, 6, }, +, 7, /, 8, ], -, (, 9, +, (, 12, -, 15, ), /, 5, )]
[-, /, [, {]
[1, 2, *, 3]
[4, +, 5, ), *, 6, }, +, 7, /, 8, ], -, (, 9, +, (, 12, -, 15, ), /, 5, )]
[-, /, [, {, (]
[1, 2, *, 3]
[+, 5, ), *, 6, }, +, 7, /, 8, ], -, (, 9, +, (, 12, -, 15, ), /, 5, )]
[-, /, [, {, (]
[1, 2, *, 3, 4]
[5, ), *, 6, }, +, 7, /, 8, ], -, (, 9, +, (, 12, -, 15, ), /, 5, )]
[-, /, [, {, (, +]
[1, 2, *, 3, 4]
[), *, 6, }, +, 7, /, 8, ], -, (, 9, +, (, 12, -, 15, ), /, 5, )]
[-, /, [, {, (, +]
[1, 2, *, 3, 4, 5]
[*, 6, }, +, 7, /, 8, ], -, (, 9, +, (, 12, -, 15, ), /, 5, )]
[-, /, [, {]
[1, 2, *, 3, 4, 5, +]
[6, }, +, 7, /, 8, ], -, (, 9, +, (, 12, -, 15, ), /, 5, )]
[-, /, [, {, *]
[1, 2, *, 3, 4, 5, +]
[}, +, 7, /, 8, ], -, (, 9, +, (, 12, -, 15, ), /, 5, )]
[-, /, [, {, *]
[1, 2, *, 3, 4, 5, +, 6]
[+, 7, /, 8, ], -, (, 9, +, (, 12, -, 15, ), /, 5, )]
[-, /, []
[1, 2, *, 3, 4, 5, +, 6, *]
[7, /, 8, ], -, (, 9, +, (, 12, -, 15, ), /, 5, )]
[-, /, [, +]
[1, 2, *, 3, 4, 5, +, 6, *]
[/, 8, ], -, (, 9, +, (, 12, -, 15, ), /, 5, )]
[-, /, [, +]
[1, 2, *, 3, 4, 5, +, 6, *, 7]
[8, ], -, (, 9, +, (, 12, -, 15, ), /, 5, )]
[-, /, [, +, /]
[1, 2, *, 3, 4, 5, +, 6, *, 7]
[], -, (, 9, +, (, 12, -, 15, ), /, 5, )]
[-, /, [, +, /]
[1, 2, *, 3, 4, 5, +, 6, *, 7, 8]
[-, (, 9, +, (, 12, -, 15, ), /, 5, )]
[-, /]
[1, 2, *, 3, 4, 5, +, 6, *, 7, 8, /, +]
[(, 9, +, (, 12, -, 15, ), /, 5, )]
[-]
[1, 2, *, 3, 4, 5, +, 6, *, 7, 8, /, +, /, -]
[9, +, (, 12, -, 15, ), /, 5, )]
[-, (]
[1, 2, *, 3, 4, 5, +, 6, *, 7, 8, /, +, /, -]
[+, (, 12, -, 15, ), /, 5, )]
[-, (]
[1, 2, *, 3, 4, 5, +, 6, *, 7, 8, /, +, /, -, 9]
[(, 12, -, 15, ), /, 5, )]
[-, (, +]
[1, 2, *, 3, 4, 5, +, 6, *, 7, 8, /, +, /, -, 9]
[12, -, 15, ), /, 5, )]
[-, (, +, (]
[1, 2, *, 3, 4, 5, +, 6, *, 7, 8, /, +, /, -, 9]
[-, 15, ), /, 5, )]
[-, (, +, (]
[1, 2, *, 3, 4, 5, +, 6, *, 7, 8, /, +, /, -, 9, 12]
[15, ), /, 5, )]
[-, (, +, (, -]
[1, 2, *, 3, 4, 5, +, 6, *, 7, 8, /, +, /, -, 9, 12]
[), /, 5, )]
[-, (, +, (, -]
[1, 2, *, 3, 4, 5, +, 6, *, 7, 8, /, +, /, -, 9, 12, 15]
[/, 5, )]
[-, (, +]
[1, 2, *, 3, 4, 5, +, 6, *, 7, 8, /, +, /, -, 9, 12, 15, -]
[5, )]
[-, (, +, /]
[1, 2, *, 3, 4, 5, +, 6, *, 7, 8, /, +, /, -, 9, 12, 15, -]
[)]
[-, (, +, /]
[1, 2, *, 3, 4, 5, +, 6, *, 7, 8, /, +, /, -, 9, 12, 15, -, 5]
[]
[-]
[1, 2, *, 3, 4, 5, +, 6, *, 7, 8, /, +, /, -, 9, 12, 15, -, 5, /, +]
[]
[]
[1, 2, *, 3, 4, 5, +, 6, *, 7, 8, /, +, /, -, 9, 12, 15, -, 5, /, +, -]
Last updated