s = input()
stack = []
res = ""
for i in s:
if i.isdecimal():
res+= i
else: #숫자가 아닌 경우
if i == "(":
stack.append(i)
elif i =="*" or i =="/":
while stack and (stack[-1] == "*" or stack[-1]=="/"):
res += stack.pop()
stack.append(i)
elif i == "+" or i == "-":
while stack and stack[-1] != "(":
res += stack.pop()
stack.append(i)
elif i ==")":
while stack and stack[-1] != "(":
res += stack.pop()
stack.pop() #여는 괄호를 빼주어야 다음 작업에 영향 X
while stack:
res += stack.pop()
print(res)
1. 현재 stack내에 값이 없기에 +는 바로 append되게 된다 (i == "+"이지만 while문의 조건인 stack이 있어야 하는 것을 만족하지 못해 바로 append 됐다.)
2. 해당 스택에 * 연산자가 제일 우선순위가 높기 때문에 +를 출력하지 않고 append처리 해준 것이다.
3. "/"의 경우엔 "*"와 우선 순위가 같아 해당 문자를 빼내 출력해준뒤 자기 자신 "/"는 append 해준다.
4. "(" 는 조건 없이 바로 stack에 넣어준다.
5. 숫자 역시 바로 출력해준다.
6. "-"나 "+"의 경우엔 "*" "/" "+" "-" 모두를 출력하지만 바로 앞에 "(" 이 오는 경우라 stack에 append 해준다.
7. ")" 닫는 괄호를 마주했을 땐 여는 괄호 전까지 모든 연산자를 빼준다. 이때 (는 출력되면 안 되기 때문에 따로 stack을 확인하는 while문이 끝났을 때 꺼내준다.
8. 마지막 작업으로는 stack에 연산자가 남아있다면 이를 비워주기 위한 작업을 진행해주면 된다.
중위 표현식을 후위 표현식으로 만들어 사용하는 것은 컴퓨터 입장에서 더 쉽게 계산을 돕는다고 한다.
'자료구조와 알고리즘 > 개인적인 코딩테스트 관련 풀이' 카테고리의 다른 글
[자료구조 활용 ][스택, 큐, 해쉬, 힙] - 공주 구하기(큐) (0) | 2022.07.18 |
---|---|
[자료구조 활용][스택, 큐, 해쉬, 힙] - 후위 연산(스택) (0) | 2022.07.17 |
[자료구조 활용 ][스택, 큐, 해쉬, 힙] - 가장 큰 수(스택) (0) | 2022.07.15 |
[이분탐색(결정알고리즘)][그리디 알고리즘] - 침몰하는 타이타닉(그리디 알고리즘) (0) | 2022.07.12 |
[이분탐색(결정알고리즘)][그리디 알고리즘] - 창고 정리(그리디 알고리즘) (0) | 2022.07.12 |