본문으로 바로가기

[인프런] 후위표기식 만들기(스택) - 파이썬

category 알고리즘 2022. 6. 11. 17:22

문제

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

입력 설명

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

출력 설명

후위표기식을 출력한다.

입력예제 1

3+5*2/(7-2)

출력예제 1

352*72-/+

문제 풀이

import sys

sys.stdin = open("in5.txt", "rt")
data = list(input())

oper = []
for i in range(len(data)):
    chr = data[i]
    if chr.isdigit():
        print(chr,end="")
    else:
        if oper:
            while True and oper:
                if (oper[-1] == "*" or oper[-1] == "/") and (chr != "(" and chr!=")"):
                    print(oper.pop(),end="")
                else:
                    break
            while True and oper:
                if (chr == "+" or chr == "-") and (oper[-1] == "+" or oper[-1] == "-"):
                    print(oper.pop(), end="")
                else:
                    break
            if chr == ")":
                while True:
                    c = oper.pop()
                    if c == "(":
                        break
                    else:
                        print(c,end="")
            else:
                oper.append(chr)
        else:
            oper.append(chr)

while oper:
    print(oper.pop())

 

입력된 값이 숫자이면 바로 출력을 합니다. 그 외의 경우는 stack이라는 변수에 넣어서 해당 변수의 마지막 값이 stack에 넣을려고 하는 값보다 우선순위가 높으면 stack에서 그 값을 다 꺼내고 마지막에 넣을려고 하는 값을 넣습니다. 입력된 값이 ")"일 경우 "(" 만날때까지 stack에 있는 값을 꺼내서 출력합니다. 여기서 우선순위는 ")" > "*", "/" > "+", "-" 순이며 왼쪽이 오른쪽 연산자보다 우선순위가 더 높습니다.

반응형