위와 같이 수식을 트리로 표현할 수도 있다. 이 때 이를 어떻게 Traversal 하느냐에 따라 수식의 표현이 달라진다.
Prefix Notation : * + / 6 3 5 - 6 4
Infix Notation : 6 / 3 + 5 * 6 -4 (괄호 필요, 가장 일반적 수식)
Postfix Notation : 6 3 / 5 + 6 4 - * (괄호 불필요)
즉, 수식에 Traversal을 적용하면 꽤 유의미한 결과를 뽑아낼 수 있다.
Parsing
Pasrsing은 일반적 수식 혹은 숫자의 나열을 트리 형태로 변환하는 것이다. 이를 컴퓨터가 해당 수식을 이해했다고 표현할 수도 있다.
즉, ((A / B + C) * (A-D) + C)라는 식을 입력받아 이를 T1 = A / B, T2 = T1 + C, T3 = A - D, T4 = T2 * T4, T5 = T4 + C의 형태로 출력한다. (이는 트리의 관계와 매우 유사한 형태를 띄는 것을 알 수 있다.)
Parsing Algorithm : 연산자에 우선 순위를 주고 동일한 우선순위일 경우 왼쪽의 연산자가 우선순위를 갖도록 한다.
while 수식을 처음부터 끝까지 읽기 if 피연산자 then 노드만들고 push to 2nd stack // 피연산자 stack if 연산자 then 우선순위 비교 with top of 1st stack // 연산자 stack case 현 input이 우선순위 높음 : 1st stack에 넣기 case top of 1st stack이 우선순위 높음 : 2nd stack으로부터 2개 pop 1st stack의 top 연산자에 2nd stack에서 pop한 값 두개 자식으로 붙여서 새 노드 만듬 해당 노드 2nd stack에 push continue case $$ : 작업종료
여기에 괄호 개념을 추가하면
여는 괄호 : Input일때 가장 우선순위가 높고, stack 안에서는 가장 우선순위가 낮다
닫는 괄호 : 가장 낮은 우선순위를 가지며 stack으로 가지 않는다. (바로 처리, (와 )는 만나면 없어진다.)