Programming 기초/Python

[Python 자료구조 #스택2] 스택을 이용한 중위표기 수식의 후위표기 변환

코딩상륙작전 2023. 5. 6. 14:55

* 후위표기 수식 계산 구현

def evalPostfix(expr):
    s = Stack()
    for token in expr:
        if token in "+-*/":
            val2 = s.pop()
            val1 = s.pop()
            if (token == '+'):
                s.push(val1 + val2)
            elif (token == '-'):
                s.push(val1 - val2)
            elif (token == '*'):
                s.push(val1 * val2)
            elif (token == '/'):
                s.push(val1 / val2)
        else:
            s.push(float(token))

    return s.pop()

 

* 연산자(Operator) 우선순위 반환 함수

def precedence(op):	# op는 operator의 약자
    if op == '(' or op == ')':
        return 0
    elif op == '+' or op == '-':
        return 1
    elif op == '*' or op == '/':
        return 2
    else:
        return -1

 

* 중위표기식의 후위 변환 구현

def Infix2Postfix(expr):
    s = Stack()
    output = []
    for term in expr:
        if term in '(':
            s.push('(')
        elif term in ')':
            while not s.isEmpty():
                op = s.pop()
                if op == '(':
                    break
                else:
                    output.append(op)
        elif term in "+-*/":
            while not s.isEmpty():
                op = s.peek()
                if (precedence(term) <= precedence(op)):
                    output.append(op)
                    s.pop()
                else:
                    break
            s.push(term)
        else:
            output.append(term)

    while not s.isEmpty():
        output.append(s.pop())

    return output

 

* 테스트 

infix1 = ['8', '/', '2', '-', '3', '+', '(', '3', '*', '2', ')']
infix2 = ['1', '/', '2', '*', '4', '*', '(', '1', '/', '4', ')']
postfix1 = Infix2Postfix(infix1)
postfix2 = Infix2Postfix(infix2)
result1 = evalPostfix(postfix1)
result2 = evalPostfix(postfix2)
print('  중위표기: ', infix1)
print('  후위표기: ', postfix1)
print('  계산결과: ', result1, end='\n\n')
print('  중위표기: ', infix2)
print('  후위표기: ', postfix2)
print('  계산결과: ', result2)

--------------------------------------------------------------------------------------
  중위표기:  ['8', '/', '2', '-', '3', '+', '(', '3', '*', '2', ')']
  후위표기:  ['8', '2', '/', '3', '-', '3', '2', '*', '+']
  계산결과:  7.0

  중위표기:  ['1', '/', '2', '*', '4', '*', '(', '1', '/', '4', ')']
  후위표기:  ['1', '2', '/', '4', '*', '1', '4', '/', '*']
  계산결과:  0.5

 

출처 : 파이썬으로 쉽게 풀어쓴 자료구조