[자료구조] 스택 3

Posted on

스택이 이용되는 대상 중에 사용자가 직접 스택을 다루는 대상으로는 후위표기법 변환 문제가 있습니다. 중위표기법이라고 해서 우리가 흔히 아는 피연산자 사이에 연산자를 표기하는 표기를 입력받아 연산자 우선 순위대로 후위표기법으로 바꾸는 문제입니다.

중위표기법이 1 + 2 라면 후위표기법은 1 2 + 이고 더 복잡한 3 + 2 * 4 – 9 / 3은 3 2 4 * + 9 3 / – 로 변환되어야 합니다.

전문가에 따르면 CPU의 ALU가 사칙연산을 수행할때 후위표기법으로 처리되기도 한다고 하네요.

중위표기법을 후위표기법으로 바꾸는 방법은 아래와 같습니다.

A + B * C 중위표기법
A + (B * C) 괄호치기
A + (B C ) 곱셈 부분 먼저 후위로 변환 A (B C) + 덧셈 부분 변환
A B C * + 완전한 후위표기법 완성

위 규칙대로 7 + 4 * 3 – 9 / 3 을 예로 들면 순서의 흐름은 이렇습니다. 변환된 결과는 postfix에 저장합니다.

(1) 7은 숫자이므로 그대로 postfix에 넣음. postfix: 7 stack: 비워짐
(2) +는 연산자이고 스택이 비어있으므로 스택에 넣음. postfix: 7 stack: +
(3) 4는 숫자이므로 그대로 postfix에 넣음. postfix:7 4 stack: +
(4) *는 연산자이므로 스택에 넣는다. +보다 우선순위가 높아서 이후에 pop할때 먼저 나온다. postfix:7 4 stack: + *
(5) 3은 숫자이므로 그냥 postfix에 넣음. postfix: 7 4 3 stack: + *
(6) – 는 연산자이고 스택에 자신보다 우선순위 높거나 같은 *, +이 있으므로 이들을 빼서 postfix 에 넣고 -를 스택에 넣는다. postfix: 7 4 3 * + stack: – 참고로 스택에 있던 + * 에서 후입선출에 의해 *가 먼저 나온다
(7) 9는 숫자이므로 그대로 postfix에 넣음. postfix: 74 3 * + 9 stack: –
(8) /는 연산자이므로 그냥 스택에 넣는다. 이 경우에도 – 보다 우선순위 높으니 그냥 넣는다. postfix: 7 4 3 * + 9 stack: – /
(9) 3은 숫자이므로 postfix에 그대로 넣음. postfix 7 4 3 * + 9 3 stack: – /
(10) 스택에 남은 -과 /를 모두 빼서 postfix에 넣는다. 이 경우에도 후입선출. postfix: 7 4 3 * + 9 3 / –

아래는 코드 예시다.

소스코드는 교재에서 빌려왔습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다