inpix식을 prefix식으로 바꿔주는 알고리즘을 알고싶습니다.

nidle의 이미지

안녕하세요,, 제가 프infix에서 prefix로 전환하는 프로그램을 만들려고합니다.
아무리 생각해두 알고리즘을 만들수가 없더군요,
한가지생각한것이있기는한데. 문제가 생겨서요,

(a+b)*c라고 한다면 우선 뒤쪽부터 피연산자는 그냥 출력하고 연산자는 스택에 넣어서 우선순위를 따져서 만드느거죠
c는 그냥 출력되고 '*'스택에 들어가고 우측괄호')' 가 스택에 들어가고
b는 출력 '+' 스택에 들어가고 a는 출력되고좌측괄호'('나 비교되면서 '+'pop 되고 출력되고, 끝으로 '*'가 출력되는거죠,
그럼 cba+*이렇게 나오고 이것을 거꾸로 쓰면prefix방식인 *+abc가나오죠

이런 알고리즘을 생각했는데 문제가 조금 있고 복잡하기두 하구요.
다른 알고리즘이 없을까 지금도 생각합니다. 아시는분이 계시다면 도와주세요
저를 도와주시려 정리되지 않은 글을 읽어주신점 감사합니다..

litiblue의 이미지

수식트리를 만드는 방법은 부모는 연산자 자식은 숫자 이런식으로
만들면 되구요. 숫자는 항상 단말노드가 되겠죠.
그리고 연산자의 우선순위에 따라서 부모 자식 관계가 됩니다.

(a + b) * c
이식을 수식 트리로 만들면?
....*....
.../\....
..+ c...
../\.....
.a b....
이트리를 prefix로 탐색하면서 찍어주면 prefix식 만들어 집니다.
트리 만드는 법은 한번 생각해 보세요

^^

nidle의 이미지

트리구조에 연산식을 삽입해야 하는 부분을 어떻게 해야하는지
잘모르겟어요,,
어떤 알고리즘으로 삽입을해야 되는지.. 책을 아무지찾아봐도
잘 나와있지가 않아서요

hyunuck의 이미지

제가 학교에서 스택 배울때 공부했던 소스입니다.
무슨 책인지 잘 몰르겠는데..(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); 
} 
hermit의 이미지

예전에 검색을 한 적이 있어서..

참고할 만한 링크들을 적어볼게요.

http://www.funducode.com/freec/datastructure/datastruct5.htm

http://www.qiksearch.com/articles/cs/infix-postfix/

참고되시길...

2006년 1월 28일만 보고 산다 -_-;

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.