inpix식을 prefix식으로 바꿔주는 알고리즘을 알고싶습니다.
글쓴이: nidle / 작성시간: 목, 2003/04/10 - 11:07오후
안녕하세요,, 제가 프infix에서 prefix로 전환하는 프로그램을 만들려고합니다.
아무리 생각해두 알고리즘을 만들수가 없더군요,
한가지생각한것이있기는한데. 문제가 생겨서요,
(a+b)*c라고 한다면 우선 뒤쪽부터 피연산자는 그냥 출력하고 연산자는 스택에 넣어서 우선순위를 따져서 만드느거죠
c는 그냥 출력되고 '*'스택에 들어가고 우측괄호')' 가 스택에 들어가고
b는 출력 '+' 스택에 들어가고 a는 출력되고좌측괄호'('나 비교되면서 '+'pop 되고 출력되고, 끝으로 '*'가 출력되는거죠,
그럼 cba+*이렇게 나오고 이것을 거꾸로 쓰면prefix방식인 *+abc가나오죠
이런 알고리즘을 생각했는데 문제가 조금 있고 복잡하기두 하구요.
다른 알고리즘이 없을까 지금도 생각합니다. 아시는분이 계시다면 도와주세요
저를 도와주시려 정리되지 않은 글을 읽어주신점 감사합니다..
Forums:


수식트리를 만들면 됩니다.
수식트리를 만드는 방법은 부모는 연산자 자식은 숫자 이런식으로
만들면 되구요. 숫자는 항상 단말노드가 되겠죠.
그리고 연산자의 우선순위에 따라서 부모 자식 관계가 됩니다.
(a + b) * c
이식을 수식 트리로 만들면?
....*....
.../\....
..+ c...
../\.....
.a b....
이트리를 prefix로 탐색하면서 찍어주면 prefix식 만들어 집니다.
트리 만드는 법은 한번 생각해 보세요
^^
답변감사합니다.,, 그런데 알지못하는부분이 잇어서요
트리구조에 연산식을 삽입해야 하는 부분을 어떻게 해야하는지
잘모르겟어요,,
어떤 알고리즘으로 삽입을해야 되는지.. 책을 아무지찾아봐도
잘 나와있지가 않아서요
스택!
제가 학교에서 스택 배울때 공부했던 소스입니다.
무슨 책인지 잘 몰르겠는데..(Imperative programming in c 라는 책 인것 같음) 아주 잘 짜여진 소스입니다.
도움이 되었으면 좋겠네요.
#include <stdio.h> #include <stdlib.h> #define MAXCOLS 60 #define TRUE 1 #define FALSE 0 #define PLUS 1 #define MINUS 1 #define MUL 2 #define DIV 2 struct stack { int top; char items[MAXCOLS]; }; int empty(struct stack *ps) { if(ps->top == -1) return TRUE; else return FALSE; } char pop(struct stack *ps) { if(empty(ps)) { printf("%s", "stack underflow"); exit(1); } return (ps->items[ps->top--]); } void popandtest(struct stack *ps, char *px, int *pund) { if(empty(ps)) { *pund = TRUE; return; } *pund = FALSE; *px = ps->items[ps->top--]; return; } void push(struct stack *ps, char x) { ps->items[++(ps->top)] = x; return; } int isoperand(char ch) { if((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9')) return TRUE; return FALSE; } int prcd(char op1, char op2) { switch(op1) { case '+' : op1 = PLUS; break; case '-' : op1 = MINUS; break; case '*' : op1 = MUL; break; case '/' : op1 = DIV; break; } switch(op2) { case '+' : op2 = PLUS; break; case '-' : op2 = MINUS; break; case '*' : op2 = MUL; break; case '/' : op2 = DIV; break; } if(op1 == '(') return FALSE; if(op2 == '(') return FALSE; if(op2 == ')') return TRUE; if(op1 >= op2) return TRUE; else return FALSE; } void postfix(char in[], char po[]) { int position, und; int outpos = 0; char topsymb = '+'; char symb; struct stack opstk; opstk.top = -1; for(position = 0; (symb = in[position]) != '\0'; position++) if(isoperand(symb)) po[outpos++] = symb; else { popandtest(&opstk, &topsymb, &und); while(!und && prcd(topsymb, symb)) { po[outpos++] = topsymb; popandtest(&opstk, &topsymb, &und); } if(!und) push(&opstk, topsymb); if(und || (symb != ')')) push(&opstk, symb); else topsymb = pop(&opstk); } while(!empty(&opstk)) po[outpos++] = pop(&opstk); po[outpos] = '\0'; return; } void main(void) { char infix[MAXCOLS]; char postr[MAXCOLS]; int pos = 0; while((infix[pos++] = getchar()) != '\n'); infix[--pos] = '\0'; printf("%s%s", "the original infix expression is ", infix); postfix(infix, postr); printf("\n%s\n", postr); }예전에 검색했었죠.
예전에 검색을 한 적이 있어서..
참고할 만한 링크들을 적어볼게요.
http://www.funducode.com/freec/datastructure/datastruct5.htm
http://www.qiksearch.com/articles/cs/infix-postfix/
참고되시길...
2006년 1월 28일만 보고 산다 -_-;
댓글 달기