中綴轉後綴

轉載其他人的,具體是誰的也找不到了。如果原作者看到,覺得心中不爽,請通知刪除。 #include <stdio.h> #include <stdlib.h> #include <time.h> #define OK 1 #define ERROR -1 #define TRUE 1 #define FALSE 0 #define MAXSIZE 50 //中綴表達式求值 //先轉爲後綴表達式再求值;爲簡單起見,使用棧的循序存儲結構實現 //棧的順序存儲結構,用一維數組實現 typedef int Status; typedef char ElemType; typedef struct { ElemType data[MAXSIZE]; int top;//棧頂指針 }Stack; //1. 初始化 Status InitStack(Stack *S){ int i; for(i=0;i<MAXSIZE;i++) S->data[i]=NULL; S->top=-1; return OK; } //2. 創建一個長度爲n的堆棧 Status CreateStack(Stack *S,int n){ if(n>MAXSIZE || n<1){ printf("輸入長度有誤!\n"); return ERROR; } srand(time(0)); int i; for(i=0;i<n;i++){ S->data[i]=rand()%100+1; } S->top=n-1; return OK; } //3. 壓棧操作 Status push(Stack *S,ElemType e){ if(MAXSIZE-1==S->top){ printf("棧已滿\n"); return ERROR; } //棧頂指向的元素有值 ++(S->top); S->data[S->top]=e; return OK; } //4. 出棧 Status pop(Stack *S,ElemType *e){ //將棧頂元素出棧,傳給e if(-1==S->top){ printf("棧爲空!\n"); return ERROR; } *e=S->data[S->top]; --(S->top); return OK; } //5. 中綴表達式轉後綴表達式 Status MidToFinal(char *mid,char *final){ //中綴表達式爲middle,要轉換成後綴表達式傳給last //新建一個棧,來存儲符號 char e; Stack S; if(OK!=InitStack(&S)){ printf("初始化棧失敗!\n"); } //當帶轉換的字符串*mid未終止時,循環處理 while(*mid){ //如果是數字,則直接輸出 if(*mid>='0' && *mid<='9'){ *(final++)=*(mid++); continue; }else if(*mid=='+' || *mid=='-' || *mid=='*' || *mid=='/' || *mid=='(' || *mid==')'){ //輸入的是合法運算符號,比較之前是否有更高優先級的符號 if(S.top==-1 || '('==*mid){ //當符號棧爲空或遇到左括號時,符號入棧 push(&S,*(mid++)); continue; } if(')'==*mid){ //遇到右括號時,棧頂元素依次出棧;直到遇到第一個左括號時結束 pop(&S,&e); *(final++)=e; while(pop(&S,&e) && e!='('){ *(final++)=e; } // printf("%c\n",e); mid++; continue; } //後續的處理都要取出臨時的棧頂元素,與當前輸入的符號*mid相比較;當臨時棧頂元素優先級大於等於輸入符號的優先級時,出棧;否則符號入棧(已經彈出一個,記得把彈出的元素也入棧) pop(&S,&e); if('+'==*mid || '-'==*mid){ if(e=='('){ push(&S,'('); push(&S,*(mid++)); continue; }else{ *(final++)=e; push(&S,*(mid++)); continue; } }else if('*'==*mid || '/'==*mid){ if('*'==e || '/'==e){ *(final++)=e; push(&S,*(mid++)); continue; }else{ push(&S,e); push(&S,*(mid++)); continue; } } }else{ printf("輸入的字符不合法!%c\n",*mid); return ERROR; } } //當待轉換的字符已經結束時,符號棧至少還有一個元素(中綴表達式的特點:數字結尾;後綴表達式以符號結尾);將棧中的元素依次出棧 while(S.top!=-1){ pop(&S,&e); *(final++)=e; } //字符串的結束符! *final='\0'; } int main() { /* Stack S; int i,n,e; if(OK!=InitStack(&S)){ printf("初始化失敗!"); return ERROR; } printf("輸入初始化棧的長度n="); scanf("%d",&n); if(OK==CreateStack(&S,n)){ for(i=0;i<=S.top;i++){ printf("%d\t",S.data[i]); } } printf("\n輸入想要插入棧的值"); while(1==scanf("%d",&e)){ if(ERROR==push(&S,e)){ break; }else{ for(i=0;i<=S.top;i++) printf("%d\t",S.data[i]); } } printf("\n接下來測試出棧!棧中的元素依次出棧\n"); while(OK==pop(&S,&e)){ getchar(); printf("%d\t",e); } */ // char data[]="3+(5*6-7/1*7)*9"; char data1[] = "(8*8/8+1-8)*3/2+4*5"; // char final[]=""; char final1[]=""; // MidToFinal(data,final); // printf("\n%s\n",final); MidToFinal(data1,final1); printf("\n%s\n",final1); return 0; }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章