중위연산식을 후위연산식으로 바꿔서 출력하기
글쓴이: kimscom / 작성시간: 화, 2008/05/27 - 2:24오전
책의 소스인데요. 숫자가 아닌 (a+b)*c 이런식으로 문자로 입력해서 결과를 후위연산으로 출력되게 하고 싶습니다.
아직 뭐가 뭔지 잘 몰라 그러니 완성된 소스를 좀 알려주시면 보고 공부하는데 많이 도움이 될 것 같네요.. 부탁드립니다.
계산 자체는 필요없구요.. 그냥 후위연산처리된 결과만 보이면 됩니다.
#include [stdio.h] // 꺽쇠가 자꾸 사라져서 []로 했습니다. #include [stdlib.h] #include [string.h] typedef int element; typedef struct stackNode { element data; struct stackNode *link; }stackNode; stackNode* top; void push(element item) { stackNode* temp=(stackNode *)malloc(sizeof(stackNode)); temp->data = item; temp->link = top; top = temp; } element pop() { element item; stackNode* temp=top; if(top == NULL) { printf("\n\n Stack is empty !\n"); return 0; } else { item = temp->data; top = temp->link; free(temp); return item; } } element peek() { element item; if(top == NULL) { printf("\n\n Stack is empty !\n"); return 0; } else { item = top->data; return item; } } void del() { stackNode* temp; if(top == NULL) { printf("\n\n Stack is empty !\n"); } else { temp = top; top = top->link; free(temp); } } void printStack() { stackNode* p=top; printf("\n STACK [ "); while(p){ printf("%d ",p->data); p = p->link; } printf("] "); } element evalPostfix(char *exp) { int opr1, opr2, value, i=0; int length = strlen(exp); char symbol; top = NULL; for(i=0; i<length; i++){ symbol = exp[i]; if(symbol != '+' && symbol != '-' && symbol != '*' && symbol != '/'){ value = symbol - '0'; push(value); } else{ opr2 = pop(); opr1 = pop(); switch(symbol){ case '+' : push(opr1 + opr2); break; case '-' : push(opr1 - opr2); break; case '*' : push(opr1 * opr2); break; case '/' : push(opr1 / opr2); break; } } } return pop(); } void main(void) { int result; char* express = "35*62/-"; printf("후위표기식 : %s", express); result = evalPostfix(express); printf("\n\n 연산결과 => %d", result); getchar(); }
Forums:
C로 배우는 알고리즘 - 이재규
자세하게 그림설명으로 나와 있습니다.
원리는 간단합니다. 스택만 이해하신다면..
그리고, 이산수학을 선이수하시면 도움이 조금 될겁니다.
Hello World.
마침 전에 과제로
마침 전에 과제로 했던 파일이 남아있어 올립니다
gcc 에서 한 겁니다
글을 보니 숫자가 아닌 문자로 받겠다고 하셨는데
그러면 isdigit()만 수정해서 쓰시면 될것 같습니다
소스를 해석해달라는 말씀이셨군요;;;
과제 그대로 제출하셨다면..
'*', '/' 가 없네요. ^^;
과제를 그대로 제출하셨다면 낭패를 봤을듯한데요. ^^;
보통 자료구조 수업의 과제로 나오죠. 큐와 스택을 이용해서 하죠.
위와 같은 소스는 컴파일러책(드래곤북)에서 단순한 패스컴파일러(드래곤북, 컴파일러의 프론트엔드쪽 스캐너(형태소분석기) & 파서 & 코드생성기 합친 단순모형)에서 나오죠.
과제도 수업, 강사, 교수의 레벨(수준, 어감이 좀 그렇군요. ^^; )에 따라 제출해야 하죠.
저도 OOP 수업에서 이 과제발표할때 위의 얘기했다고 된통 면박(?)을 당했죠. ㅋㅋㅋ
ps. 차라리 lex & yacc 이용함을 추천. 교수도 훌륭(?)하다고 생각해줌(?)... ^^;
Hello World.
댓글 달기