/* Name:infixSuffixConv.c Copyright: personal Author: hojor Date: 10-06-10 21:24 Description: infix convert to suffix */ #include<stdio.h> #include<stdlib.h> #define STACK_SIZE 20 ////~stack start //stack struct typedef struct stack{ int top; int a[STACK_SIZE]; }stack; //create stack stack * createStack() { stack * s = (stack *)malloc(sizeof(stack)); s->top = -1; return s; } //get the the top value of stack int getTop(stack * s) { return s->a[s->top]; } //is stack empty? int isEmpty(stack * s) { return s->top == -1; } //is stack full? int isFull(stack * s) { return s->top == (STACK_SIZE-1); } //pop stack return value int pop(stack * s) { if(!isEmpty(s)) { return s->a[s->top--]; } else { printf("stack empty!!\n"); return 0; } } //push value x to stack void push(stack * s,int x) { if(!isFull(s)) { s->a[++s->top] = x; } else { printf("stack is full!!\n"); } } ////~ ////~infix suffix convert start //get the level of symbol int getLevel(char symbol) { switch(symbol) { case '(': return 10; break; case '*': case '/': return 9; break; case '+': case '-': return 8; break; default: printf("symbol error!!:[%c]\n",symbol); } } //is char symbol?? int isSymbol(char ch) { return (ch == '(')||(ch == '*')||(ch == '/') \ ||(ch == '-')||(ch == '+')||(ch == ')'); } //function of convert infix to suffix void infix_suffix_convert(char * infixStr,char * suffixStr) { stack * symStack = createStack(); int iCount = strlen(infixStr),i,flag,j,k,n; i=j=k=flag=n=0; for(i=0;i<=iCount;i++) { //表達式中讀到字符爲運算符 if(isSymbol(infixStr[i])) { /*符號入棧條件,如果當前讀取的符號不是閉合括號,並且棧爲空或棧頂 爲開括號或棧頂的符號優先級小於當前讀取符號則符號入棧*/ if(( isEmpty(symStack) && \ infixStr[i] != ')' ) || ( (char)getTop(symStack)=='(' && \ infixStr[i] != ')' ) || ( infixStr[i]!=')' && \ getLevel((char)getTop(symStack)) < getLevel(infixStr[i]) )) { push(symStack,infixStr[i]); } else if(infixStr[i] == ')') {/*如果遇到閉合括號,符號出棧,輸出,直到開括號出棧爲止*/ while((char)getTop(symStack)!='(') { sprintf(suffixStr,"%s %c",suffixStr,pop(symStack)); } pop(symStack); } else {/*如果棧爲非空並且棧頂符號優先級大於當前讀取的符號則出棧, 輸出,直到棧頂符號的優先級小於當前讀取的符號爲止*/ while(!isEmpty(symStack) && (getLevel((char)getTop(symStack)) \ >= getLevel(infixStr[i])) ) { sprintf(suffixStr,"%s %c",suffixStr,pop(symStack)); } push(symStack,infixStr[i]); } flag=2; } else if(infixStr[i]>='0' && infixStr[i]<='9') {//表達式中讀取的字符爲數字,輸出 if(flag == 2 || flag == 0) { sprintf(suffixStr,"%s %d",suffixStr,atoi(&infixStr[i])); flag = 3; } } else { ; } } //因數字已經全部輸出,故棧內所有符號出棧,輸出 while(!isEmpty(symStack)) sprintf(suffixStr,"%s %c",suffixStr,pop(symStack)); } ////~ int main() { ///---stack test printf("\n********** stack test ***********\n"); int i,j=0,k=0; stack * s = createStack(); for(i=0;i<10;i++) push(s,i); for(i=0;i<10;i++) printf("%d ",pop(s)); putchar('\n'); free(s); ///---convert start printf("\n********* convert start **********\n"); int a = 50; char * infix="( 177 + 25 ) * 555 + (35 + 655 )"; printf("\n中綴表達式:\n%s\n",infix); char suffix[100]; memset(suffix,0,sizeof(suffix)); infix_suffix_convert(infix,suffix); printf("\n後綴表達式:\n%s\n\n",suffix); system("pause"); return 0; }