후위표기식 만들기(스택)

중위표기식이 입력되면 후위표기식으로 변환하는 프로그램을 작성하라.
중위표기식은 우리가 흔히 쓰은 표현식입니다. 즉 3+5 와 같이 연산자가 피연산자 사이에 있으면 중위표기식이다.
후위표기식은 35+ 와 같이 연산자가 피연산자 뒤에 있는 표기식이다.
예를 들어 중위표기식이 3+5*2 를 후위표기식으로 표현하면 352*+ 로 표현된다.
만약 다음과 같이 연산 최우선인 괄호가 표현된 식이라면 (3+5)*2 이면 35+2* 로 바꾸어야 한다.


입력 설명

첫 줄에 중위표기식이 주어진다. 길이는 100을 넘지 않는다.
식은 1~9의 숫자와 +, -, *, /, (, ) 연산자로만 이루어진다.


출력 설명

후위표기식을 출력한다.


입력 예제 1

3+5*2/(7-2)

 

출력 예제 1

352*72-/+


입력 예제 2

3*(5+2)-9

 

출력 예제 2

352+*9-


풀이

숫자일 때는 출력해주고, 연산자일 때는 조건문을 통해 연산을 해주거나 스택에 저장해주면서 우선순위를 두어야 한다.

 

숫자일 때 출력해주기 위해서 isdeciaml() 함수를 이용하는데,

isdecimal() 함수는 주어진 문자열이 int형으로 변환이 가능한지 알아내는 함수이다.
즉, str로 되어있는 문자열이나 리스트를 int형으로 변환 가능한지 판별하는 함수이다.

 

연산자일 때

( : 여는 괄호는 그 앞에 어떤 연산자가 있어도 그 뒤에 연산자부터 계산이 이루어지기 때문에, 어떠한 처리없이 스택에 추가해준다.

) : 닫는 괄호는 여는 괄호와 그 사이에 있는 모든 연산을 처리해주고, 마지막에 여는 괄호를 pop 해준다.

* / : 곱하기와 나누기는 그 전의 연산자(스택의 맨위)가 곱하기와 나누기일 때, 그 연산자를 처리해주고, 그 후에 곱하기와 나누기를 스택의 맨 위에 추가해준다. 

+ - : 더하기와 빼기는 그 전의 연산자(스택의 맨위)가 여는 괄호일 때만 바로 처리해주고, 그렇지 않으면 그냥 스택의 맨위에 추가해준다.

 

순위기 밀린 연산자들은 스택의 맨위에서 부터 하나씩 처리해준다.


코드

a = input()
stack = []
answer = ''

for x in a :
    # 피연산자일 경우
    if x.isdecimal():# 10진수인지 확인
        answer += x 
    
    # 연산자일 경우 +-*/()
    else:
        if x=='(':
            stack.append(x)         
        elif x== ')':
            while stack and stack[-1]!='(': # (를 만날 때까지 연산.
                answer += stack.pop()
            stack.pop() # 스택에 쌓여있는 ( 없에기

        elif x=='*' or x=='/': 
            # 스택이 비어있지 않고 스택의 마지막이 *나 /일 때
            while stack and (stack[-1]=='*'or stack[-1]=='/'):
                answer += stack.pop() # 끄집어내서 누적
            stack.append(x)
        elif x=='+' or x=='-': # +-는 항상 후순위
            while stack and stack[-1]!='(':
                answer += stack.pop() # (를 만날 때까지 연산.
            stack.append(x)
    
# 스택에 남아있는 것들 연산
while stack:
    answer += stack.pop()

print(answer)

'⏰ 코딩테스트 > 자료구조 활용' 카테고리의 다른 글

응급실(큐)  (0) 2021.10.21
공주 구하기(큐)  (0) 2021.10.20
후위식 연산(스택)  (0) 2021.10.19
백준 알고리즘 - 10799 - 쇠막대기  (0) 2021.10.16
가장 큰 수(스택)  (0) 2021.10.14
복사했습니다!