Stack을 이용하여 infix 수식을 posfix 로 바꾸는 프로그램. 많이들 하는 것이고... 소스도 엄청 많고 공개된 알고리즘들도 많이 있음. 교과서에도 실려있으니... 그럼에도 불구하고... 많은 학생들이 애를 먹는 문제.
내 경우에는 어떠한 알고리즘을 구현하기 전에 손으로 충분한 문제를 풀어봅니다. 어떤 공통된 패턴 내지는 사고의 흐름만 찾아내면 프로그램으로 구현하는 것은 그리 어렵지 않기 때문이죠. 이번 프로그램 같은 경우, 조건의 제한이 ( ) * / - + 로 단순했기 대문에 다른 알고리즘 들보다 훨씬 단순한 알고리즘을 만들어 사용했습니다.
우선 입력과 출력 부터 봅시다. 입력과 출력은 모두 파일로 합니다.
입력 : infix
A+B
C-D
E*F
G/H
(A*B*C/D)+(E*F+(G*H/I)-J)
(A*B*C/D)
(A + B * C) / (D -E )
출력 : postfix + simple assembly code
--------------------------------------------------
A+B => AB+
--------------------------------------------------
MOVE R1, B
MOVE R2, A
ADD R2, R1
MOVE TEMP1, R2
RETURN TEMP1
--------------------------------------------------
--------------------------------------------------
C-D => CD-
--------------------------------------------------
MOVE R1, D
MOVE R2, C
SUB R2, R1
MOVE TEMP1, R2
RETURN TEMP1
--------------------------------------------------
--------------------------------------------------
E*F => EF*
--------------------------------------------------
MOVE R1, F
MOVE R2, E
MUL R2, R1
MOVE TEMP1, R2
RETURN TEMP1
--------------------------------------------------
--------------------------------------------------
G/H => GH/
--------------------------------------------------
MOVE R1, H
MOVE R2, G
DIV R2, R1
MOVE TEMP1, R2
RETURN TEMP1
--------------------------------------------------
--------------------------------------------------
(A*B*C/D)+(E*F+(G*H/I)-J) => ABCD/**EF*GHI/*+J-+
--------------------------------------------------
MOVE R1, D
MOVE R2, C
DIV R2, R1
MOVE TEMP1, R2
MOVE R1, TEMP1
MOVE R2, B
MUL R2, R1
MOVE TEMP2, R2
MOVE R1, TEMP2
MOVE R2, A
MUL R2, R1
MOVE TEMP3, R2
MOVE R1, F
MOVE R2, E
MUL R2, R1
MOVE TEMP4, R2
MOVE R1, I
MOVE R2, H
DIV R2, R1
MOVE TEMP5, R2
MOVE R1, TEMP5
MOVE R2, G
MUL R2, R1
MOVE TEMP6, R2
MOVE R1, TEMP6
MOVE R2, TEMP4
ADD R2, R1
MOVE TEMP7, R2
MOVE R1, J
MOVE R2, TEMP7
SUB R2, R1
MOVE TEMP8, R2
MOVE R1, TEMP8
MOVE R2, TEMP3
ADD R2, R1
MOVE TEMP9, R2
RETURN TEMP9
--------------------------------------------------
--------------------------------------------------
(A*B*C/D) => ABCD/**
--------------------------------------------------
MOVE R1, D
MOVE R2, C
DIV R2, R1
MOVE TEMP1, R2
MOVE R1, TEMP1
MOVE R2, B
MUL R2, R1
MOVE TEMP2, R2
MOVE R1, TEMP2
MOVE R2, A
MUL R2, R1
MOVE TEMP3, R2
RETURN TEMP3
--------------------------------------------------
--------------------------------------------------
(A+B*C)/(D-E) => ABC*+DE-/
--------------------------------------------------
MOVE R1, C
MOVE R2, B
MUL R2, R1
MOVE TEMP1, R2
MOVE R1, TEMP1
MOVE R2, A
ADD R2, R1
MOVE TEMP2, R2
MOVE R1, E
MOVE R2, D
SUB R2, R1
MOVE TEMP3, R2
MOVE R1, TEMP3
MOVE R2, TEMP2
DIV R2, R1
MOVE TEMP4, R2
RETURN TEMP4
--------------------------------------------------
대략 이해가 되시는지. 문제는 간단 명료 합니다.
'Exercise & Quizz > C++' 카테고리의 다른 글
Stack calculator #4 - Infix - Postfix translation using Stask structure (0) | 2008.08.21 |
---|---|
Stack calculator #3 - Infix - Postfix translation using Stask structure (0) | 2008.08.21 |
Stack calculator #2 - Infix - Postfix translation using Stask structure (0) | 2008.08.21 |
A mouse in the Maze : 미로찾기 (0) | 2008.08.21 |
Simple Linked List (practice) (0) | 2008.08.20 |