알고리즘 질문입니다.
글쓴이: namola / 작성시간: 금, 2004/04/02 - 11:28오전
#include <stdio.h> #include <stdlib.h> #define MAX 10 typedef struct _node /*나무의 노드*/ { int key; struct _node *left; struct _node *right; } node; node *head, *tail;/* 머리와 꼬리*/ node *stack[MAX];/*스택 구조의 정의*/ node *queue[MAX];/*큐 구조의 정의*/ int front, rear; int top; void init_stack( void ); node *push( node *t ); node *pop( void ); int is_stack_empty( void ); void init_queue(); node *put( node *k ); node *get( void ); int is_queue_empty( void ); void init_tree( void ); int is_operator( int k ); node *make_parse_tree( char *p ); int is_legal( char *s ); void visit( node *t ); void preorder_traverse( node *t ); void inorder_traverse( node *t ); void postorder_traverse( node *t ); void levelorder_traverse( node *t ); int main( void ) { char post[256];/*후위표기법 수식을 저장*/ init_stack(); /*스택과 큐의 나무의 초기화*/ init_queue();/*큐를 초기화 하는 함수*/ init_tree();/*나무 구조의 초기화*/ while( 1 ) { printf("\n Input Postfix expression ->"); fgets( post, sizeof(post), stdin ); if( *post == NULL )/*아무것도 입력하지 않은 경우*/ { printf("\n Program ends....\n"); exit( 0 ); } if( !is_legal( post ) )/*수식이 적법하지 않으면*/ { printf("\nExpression is not legal.\n"); continue; } head->right = make_parse_tree( post );/*수식나무 구성*/ printf("\nPreorder traverse ->"); preorder_traverse( head->right ); printf("\nInorder traverse ->"); inorder_traverse( head->right ); printf("\nPostorder traverse ->"); postorder_traverse( head->right ); printf("\nLevelorder traverse ->"); levelorder_traverse( head->right ); } return 0; } void init_stack( void ) { top = -1; } node *push( node *t ) { if( top >= MAX - 1 ) { printf("\n Stack overflow.\n"); return NULL; } stack[++top] = t; return t; } node *pop( void ) { if( top < 0 ) { printf("\n Stack underflow." ); return NULL; } return stack[top--]; } int is_stack_empty( void ) { return ( top == -1 ); } void init_queue( void ) { front = rear = 0; } node *put( node *k ) { if( ( rear + 1 ) % MAX == front )/*큐가 꽉 찼으면*/ { printf("\n Queue overflow."); return NULL; } queue[rear] = k; rear = ++rear % MAX; return k; } node *get( void ) { node *i; if( front == rear )/*큐가 비어 있으면*/ { printf("\n Queue underflow."); return NULL; } i = queue[front]; front = ++front % MAX; return i; } int is_queue_empty( void ) { return ( front == rear ); } void init_tree( void )/*나무 구조의 초기화*/ { head = (node*)malloc( sizeof( node ) ); tail = (node*)malloc( sizeof( node ) ); head->left = tail; head->right = tail; tail->left = tail; tail->right = tail; } int is_operator( int k )/*k가 연산자이면 참*/ { return ( k == '+' || k == '-' || k == '*' || k == '/' ); } node *make_parse_tree( char *p )/*후외 표기법 수식에서 수식 나무 구성*/ { node *t; while( *p ) { while( *p == ' ' )/*공백 문자는 제거*/ p++; t = (node*)malloc( sizeof( node ) ); t->key = *p; t->left = tail; t->right = tail; if( is_operator( *p ) )/* 연산자이면 팝을 하여 자식 노드로 삼음*/ { t->right = pop(); t->left = pop(); } push( t ); p++; } return pop(); } int is_legal( char *s ) { int f = 0; while( *s ) { while( *s == ' ' )/*공백을 제거*/ s++; if( is_operator( *s ) ) { printf("리턴값 : %d\n", is_operator( *s ) ); f--;/*연산이면 감소*/ } else { f++;/*피연산자 이면 증가*/ //printf("f 증가 : %d\n", f ); } if( f < 1 ) break;/* f가 1보다 작아지면 언더플로*/ s++; } printf(" f: %d\n", f ); return ( f == 1 );/* 피연산자 - 연산자수 = 1이 되어야함*/ } void visit( node *t )/*........_traverse()류 함수에서 사용*/ { printf("%c", t->key ); } void preorder_traverse( node *t )/*뿌리를 먼저 타는 방식*/ { if( t != tail ) { visit( t ); preorder_traverse( t->left ); preorder_traverse( t->right ); } } void inorder_traverse( node *t )/*뿌리를 중간에 타는 방식*/ { if( t != tail ) { inorder_traverse( t->left ); visit( t ); inorder_traverse( t->right ); } } void postorder_traverse( node *t )/*뿌리를 나중에 타는 방식*/ { if( t != tail ) { postorder_traverse( t->left ); postorder_traverse( t->right ); visit( t ); } } void levelorder_traverse( node *t )/*층별로 타는 방식*/ { put( t ); while( !is_queue_empty() ) { t = get(); visit( t ); if( t->left != tail ) put( t->left ); if( t->right != tail ) put( t->right ); } }
에러는 다음과 같이 나옵니다.
tree.c: In function `main': tree.c:50: warning: comparison between pointer and integer tree.c: In function `put': tree.c:126: warning: operation on `rear' may be undefined tree.c: In function `get': tree.c:140: warning: operation on `front' may be undefined
만약에 이프로그램을 실행 시키면
Input Postfix expression->AB+CD-*E/FG*+ Preorder traverse->+/*+AB-CDE*FG Inorder traverse->A+B*C-D/E+F*G Postorder traverse->AB+CD-*E/FG*+ Levelorder traverse->+/**EFG+-ABCD 아무것도 입력안하고 ENTER만 쳤을때는 Input Postfix expression-> Program ends....
이렇게 나와야 하는데...
Input Postfix expression ->AB+CD-*E/FG*+ Expression is not legal. 엔터만 쳤을겨우 Input Postfix expression -> Preorder traverse -> Inorder traverse -> Postorder traverse -> Levelorder traverse -> Input Postfix expression ->
무엇이 잘못된건가요.
Forums:
^^
입렵받는 것을 다음과 같이 해보니
잘 되는군요. 8)
-----------
청하가 제안하는 소프트웨어 엔지니어로써 재미있게 사는 법
http://sozu.tistory.com
Re: 알고리즘 질문입니다.
line 50을
if( strcmp(post,"\n") == 0 )/*아무것도 입력하지 않은 경우*/
또는
if( post[0] == '\n' )/*아무것도 입력하지 않은 경우*/
----
자신을 이길 수 있는자는
무슨짓이든 할수있다..
즉..무서운 넘이란 말이지 ^-_-^
나? 아직 멀었지 ㅠㅠ
일단 답변 감사합니다.엔터처리는 이제는 양호하게 됩니다.그런데..
일단 답변 감사합니다.
엔터처리는 이제는 양호하게 됩니다.
그런데...
왜 그러는 거지요 그리고...
다음과 같은 WARNNING
gcc -o tree tree.c -Wall
[quote="nayana"][code:1]Input Postfix
디버거로 post의 값을 찍어보면 아시겠지만,
스트링의 끝에 '\n'이 들어갑니다.
그걸 제거 하시면 문제없이 돌아갑니다.
글쎄요..제 기계에서는 에러없이 도는데요.. gcc 2.95 입니다.
ps. 디버거를 사용하시는 습관을 들어보시기 바랍니다.
----
자신을 이길 수 있는자는
무슨짓이든 할수있다..
즉..무서운 넘이란 말이지 ^-_-^
나? 아직 멀었지 ㅠㅠ
댓글 달기