1. 程式人生 > 實用技巧 >棧的例項—中綴表示式轉化字尾表示式

棧的例項—中綴表示式轉化字尾表示式

思路:

考慮括號和優先順序

/* 1.如果是數字,直接列印 2.如果是右括號,彈出並列印,直到出現左括號只彈出 3.如果是+,-,棧空直接入棧,否則,依次彈出列印直到遇到左括號 4.如果是*,/,(,直接入棧。 */
/*
1.如果是數字,直接列印
2.如果是右括號,彈出並列印,直到出現左括號只彈出
3.如果是+,-,棧空直接入棧,否則,依次彈出列印直到遇到左括號
4.如果是*,/,(,直接入棧。
*/
//中綴表示式轉換成字尾表示式
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define
STACK_INIT_SIZE 20 //儲存棧的長度,棧大小 #define STACKINCREMENT 10 //當棧空間不夠時,每次增加的幅度 #define MAXBUFFER 10 typedef char ElemType; typedef struct { ElemType *base; ElemType *top; int stackSize; } sqStack; void InitStack(sqStack *s) { s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof
(ElemType)); if(!s->base) { exit(0); } s->top = s->base; s->stackSize = STACK_INIT_SIZE; } //壓棧操作 void Push(sqStack *s,ElemType e) { if(s->top-s->base>=s->stackSize) { //為s->base指標指向的記憶體塊 重新分配記憶體 s->base=(ElemType *)realloc
(s->base,(s->stackSize+STACKINCREMENT) * sizeof(ElemType)); //若為空,則分配失敗 if(!s->base) { exit(0); } } *(s->top) = e; //把資料e壓入棧頂指標指向的地址 s->top++; } //出棧操作 void Pop(sqStack *s,ElemType *e) { if(s->top==s->base) { return; } *e = *--(s->top); //先減再把值賦給e } int StackLen(sqStack s) { return (s.top - s.base); } int main() { char c; char e; sqStack s; int i = 0; InitStack(&s); printf("請輸入中綴表示式,以#作為結束標誌:\n"); scanf("%c",&c); while(c!='#') { //i用於除錯,因為結果不對,一直是隻出現第一組數,就啥也沒了 //原因:竟然是scanf("%c", &c);裡寫成了單引號 //printf("%d",i++); while(c>='0' && c<='9') { printf("%c", c); scanf("%c", &c); if(c<'0' || c>'9') { printf(" "); } } // while(isdigit(c) || c=='.') // { // printf("%c", c); // scanf("%c", &c); // if(! isdigit(c)) // { // printf(' '); // } // } if(')'==c) { Pop(&s, &e); while('('!=e) { printf("%c ", e); Pop(&s, &e); } } else if('+'==c || '-'==c) { if(!StackLen(s)) { printf("vds"); Push(&s, c); } else { do { Pop(&s, &e); if('('==e) { Push(&s, e); } else { printf("%c ", e); } } while (StackLen(s) && '(' != e); //****:重點:這句容易忘 Push(&s, c); } } else if('*'==c || '/'==c || '('==c) { Push(&s, c); } else if('#'==c) { break; } else { printf("\n出錯:輸入格式錯誤!\n"); return -1; } scanf("%c", &c); } while(StackLen(s)) { Pop(&s, &e); printf("%c ", e); } return 0; }
View Code

遇到的問題:

//i用於除錯,因為結果不對,一直是隻出現第一組數,就啥也沒了 輸入12+3#  結果:12 沒了!!!! //原因:竟然是scanf("%c",&c);裡寫成了單引號