ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Prefix, Infix, Postfix 표기식 및 스택을 이용한 계산
    면접대비 CS/데이터 구조 2025. 3. 12.
    전위 표기식, 중위 표기식, 후위 표기식에 관한 문제이다.
    BOJ에도 비슷한 문제가 있다.(https://www.acmicpc.net/problem/1935, https://www.acmicpc.net/problem/1918)
    전위 표기식은 연산자가 피연산자 앞에 오는 표기법이다(+AB)
    중위 표기식은 일반적으로 쓰는 표기방법이다(A+B)
    후위 표기식은 연산자가 피연산자의 뒤에 오는 표기방법이다.(AB+)
    
    중위 표기식을 후위 표기식으로 바꾸어 계산한다.
    들어가기 전 연산자 우선순위를 고려해야 한다.
    1순위 : ( )
    2순위 : * /
    3순위 : + -
    
    (4-(1+3)*2)+(4/2)
    1. 숫자가 나오면 그대로 출력한다.
    2. 1순위인 여는 괄호가 나오면 스택에 넣는다.
    3. 2순위인 *, /가 나오면 스택에 넣는다.
    4. 3순위인 +, - 연산이 나오면 여는 괄호, 여는 괄호가 으면 스택의 끝까지 출력하고 해당 연산자를 스택에 넣는다.
    5. 닫는 괄호가 나오면 스택에서 여는 괄호가 나올때까지 pop한다.
    
    결과 : 413+2*-42/+
    
    
    예제 : (4-(1+3)*2)+(4/2)
    계산결과 : -2
    예제를 가지고 전위 표기식, 후위 표기식을 만들어준다
    
    ---------------------------- 계산법 ----------------------------
    전위 표기법 : +-4*+132/42
    전위 표기법은 스택의 peek와 현재 값이 숫자이면
    스택의 값을 꺼낸 후 스택의 peek가 연산자이면 연산자에 따라 두 값을 계산 후에 다시 스택이 넣어준다.
    두 수가 연속적으로 나오기 전 까지 연산자와 숫자를 스택에 계속 삽입한다. 스택의 방향은 [] < 오른쪽이 입구이다.
    1. [ +, -, 4, *, + , 1 ]
    
    +-4*+132/42
          ^ 현재 값
    2. 스택의 peek가 1이고 현재 값이 3이니 스택의 1을 꺼내 임시값에 저장한다. [ +, -, 4, *, + ]
    current = 3, temp = 1
    스택의 peek가 +연산이니 두 값을 더하고 연산자를 pop시킨 후 더한 값인 4를 다시 스택에 넣는다.
    [ +, -, 4, *, 4 ]
    
    +-4*+132/42
           ^ 현재 값
    3. 스택의 peek가 4이고 현재 값이 2이니 스택의 4를 꺼내 임시값에 저장한다. [ +, -, 4, * ]
    current = 2, temp = 4
    스택의 peek가 * 연산이니 두 값을 곱하고 연산자를 pop 후 곱한 값인 8을 스택에 넣는다
    [ +, -, 4, 8]
    
    +-4*+132/42
            ^ 현재 값
    4. 현재 값이 연산자니 스택에 넣는다
    [ +, -, 4, 8, / ]
    
    +-4*+132/42
             ^ 현재값
    5. 스택의 peek가 연산자고 현재 값이 숫자니 스택에 넣는다
    [ +, -, 4, 8, /, 4 ]
    
    +-4*+132/42
              ^ 현재 값
    6. 스택의 peek가 4이고 현재값이 2이니 스택의 4를 꺼내 임시값에 저장한다. [ +, -, 4, 8, / ]
    current = 2, temp = 4
    스택의 peek가 / 연산이니 두 값을 나누고 연산자를 pop한 후 나눈 값인 2를 스택에 넣는다.
    [ +, -, 4, 8, 2]
    
    7. 계산식의 순회가 끝났으니 스택의 남은 값을 가지고 계산을 마저 한다.
      7.1 임시 스택 하나를 만든다. []
      7.2 기존 스택에서 연산자가 나올때 까지 값을 임시 스택으로 옮긴다.
          [ +, - ], [ 4, 8, 2 ]
      7.3 기존 스택에서 연산자가 발견되면 임시 스택에 있는 숫자를 두 개 빼고 연산자에 맞춰 계산을 한다. 계산 후 연산자는 pop하고 계산된 값은 임시 스택에 다시 넣는다. 계산은 꺼낸 값 순서대로 계산한다.
          2 - 8 = -6, -> [ + ], [ 4, -6 ]
      7.4 스택이 빌 때 까지 7.2, 7.3을 반복한다.
          4 + (-6) = -2, [], []
    
    결과 : -2
    
    후위 표기법 : 413+2*-42/+
    전위 표기법과 비슷하다. 전위 표기법은 현재 값과 스택의 끝이 숫자인지 비교했다면, 후위 표기법은 현재 값이 연산자인지 아닌지 판단한다.
    1. 연산자가 오기 전까지 스택에 값을 넣는다.
    [ 4, 1, 3 ]
    
    413+2*-42/+
       ^ 현재 값
    2. 연산자가 나오면 스택의 값 두개를 빼 연산 후 다시 넣어준다.
       LIFO니 먼저 들어간 1이 앞에 오고 나중에 들어간 3이 뒤에 와야 한다.
       1 + 3 = 4
    [ 4, 4 ]
    
    413+2*-42/+
        ^ 현재 값
    3. 현재 값이 2이니 스택에 넣는다.
    [ 4, 4, 2 ]
    
    413+2*-42/+
         ^ 현재 값
    4. 현재 값이 연산자니 스택의 두 값을 빼서 연산 후 스택에 다시 넣어준다. 4 + 2 = 8
    [ 4, 8 ]
    
    413+2*-42/+
          ^ 현재 값
    5. 현재 값이 연산자니 스택의 두 값을 빼서 연산 후 스택에 다시 넣어준다. 4 - 8 = -4
    [ -4 ]
    
    413+2*-42/+
           ^ 현재 값
    6. 뒤에 오는 숫자는 계속 스택에 넣어준다.
    [ -4, 4, 2 ]
    
    413+2*-42/+
             ^ 현재 값
    7. 현재 값이 연산자니 스택의 두 값을 빼서 연산 후 스택에 다시 넣어준다. 4 / 2 = 2
    [ -4, 2]
    
    413+2*-42/+
              ^ 현재 값
    8. 현재 값이 연산자니 스택의 두 값을 빼서 연산 후 스택에 다시 넣어준다. -4 + 2 = -2
    [ -2 ]
    
    9. 다음에 올 값이 없고, 스택의 크기가 1이니 계산이 끝났다.
    답 : -2

    '면접대비 CS > 데이터 구조' 카테고리의 다른 글

    Queue 2개로 Stack 만들기  (0) 2025.03.12
    Stack 2개로 Queue 구현하기  (0) 2025.03.12

    댓글

Designed by Tistory.