자료 구조2012. 5. 14. 19:46

중위 표기법과 후위 표기법

일반적으로 사용하는 수식의 표기법을 '중위 표기법'이라고 한다.

8 - 3 * 2


'후위 표기법'은 연산자를 피연산자 뒤에 위치시킨다는 규칙을 가지고 있다.

아래의 식은 위의 중위 표기법의 수식을 후위 표기법으로 바꾼 것이다.

8 3 2 * -


후위 표기식은 스택을 이용해서 계산할 수 있다.


수식을 읽어 피연산자일 경우 스택에 저장. '8'을 스택에 저장합니다.


'3' 또한 피연산자로 스택에 저장합니다.


'2'도 마찬가지로 스택에 저장합니다.


'*' 연산자가 나타났습니다. 연산자가 나올 경우에는 스택에 저장된 피연산자 2개를 꺼내서 연산자에 해당하는 연산을 하여 결과값을 스택에 저장합니다. 이 과정에서는 '2 * 3'의 연산 결과인 '6'이 스택에 저장됩니다.

마지막으로 '-' 연산자가 나타나 스택에 저장된 피연산자 2개를 꺼내서 연산을 합니다. '8 - 6'의 결과인 '2'가 스택에 저장됩니다.


아래는 이 과정을 순서도로 나타낸 것이다.




중위 표기법에서 후위 표기법으로의 변환 알고리즘

(*중위 표기법의 괄호 : 우선순위가 낮은 연산도 괄호 안에 묶이게 되면 다른 연산보다 우선하여 계산한다. )

  1. 입력받은 중위 표기식에서 토큰을 읽는다.
  2. 토큰이 피연사자이면 토큰을 결과에 출력한다.
  3. 토큰이 연산자(괄호 포함)일 경우, 스택의 최상위 노드의 연산자와 비교하여 우선순위가 높으면(왼쪽 괄호는 우선순위가 가장 낮지만 예외적으로 항상 스택에 삽입) 스택에 삽입하고, 낮을 경우 결과에 출력한다.
  4. 토큰이 ')'이면 최상위 노드에 '('가 올때 까지 스택에 제거 연산을 수행하고 제거한 노드에 담긴 연산자를 출력
  5. 중위 표기식에 더 읽을 것이 없다면 빠져나가고, 읽을 것이 있다면 1부터 다시 반복

 토큰

작업 

출력 

스택 

 (11 + 2) * 15

 스택에 '(' 삽입

 

 ( 

 (11 + 2) * 15  

 11 출력

 11 

 ( 

 (11 + 2) * 15  

 스택에 '+' 삽입

 11

 + ( 

 (11 + 2) * 15  

 2 출력

 11 2  + (
 (11 + 2) * 15  

 스택의 모든 연산자 제거&출력

 11 2 +

 
 (11 + 2) * 15  

 스택에 '*' 삽입

 11 2 + 

 * 

 (11 + 2) * 15  

 15 출력

 11 2 + 15

 * 

 (11 + 2) * 15  

 스택의 모든 연산자 제거& 출력 

 11 2 + 15 * 

 


사칙연산 계산기 소스코드 







'자료 구조' 카테고리의 다른 글

Linked Queue(링크드 큐)  (0) 2012.05.23
Queue(큐) : 순환 큐(Circular Queue)  (0) 2012.05.17
Stack (스택)  (0) 2012.05.11
Circular Linked List (환형 연결 리스트)  (0) 2012.05.11
Doubly Linked List (이중 연결 리스트)  (0) 2012.05.11
Posted by elluma