棧的三個簡單應用
阿新 • • 發佈:2020-09-21
根據真題需求,主要再回顧一下棧在括號匹配 、表示式求值和共享棧的運用。
1、括號匹配
問題描述:
演算法思想:①若是左括號,入棧;②若是右括號,出棧一個左括號判 斷是否與之匹配;③檢驗到字串尾時,還要檢查棧是否為空,只有棧空,整個字串才是括號匹配的。
演算法實現:
bool check(char str) { stack s; InitStack(s); int len = strlen; //字串長度 for(int i=0;i<len;i++) { char a = str[i]; switch(a) { case'(': case'[': Push(s,a); break; case')': if(Pop(s)!='(') return false; break; case']': if(Pop(s)!='[') return false; break; } } if(Empty(s)) return true; else return false; }
2、表示式求值
問題描述:
實現思想:
從左到右掃描表示式的每個數字和符號,遇到數字就進棧,遇到符號就將處於棧頂的兩個數字出棧然後跟這個符號進行運算,最後將運算結果進棧,直到最終獲得結果。
實現案例:
將中綴轉換為字尾:
① 按運算子優先順序對所有運算子和它的運算數加括號。(原本的括號不用加)
② 把運算子移到對應的括號後。
③ 去掉括號。
3、共享棧
問題描述:
共享棧的結構:
#define Max 100 //棧中元素最大個數 typedef struct { Elemtype data[Max]; int top1; //棧1棧頂元素 int top2; //棧2棧頂元素 }ShareStack;
棧滿/棧空條件:
ShareStack S;
S.top1+1==S.top2 //棧滿
S.top1=-1,S.top2=MAX; //棧空
進棧操作:
bool Push(ShareStack &S ,ElemType x,int stackNum) { if(S.top1+1==S.top2) return false; if(stackNum==1) S.data[++S.top1]=x; //棧1有元素進棧 else if(stackNum==2) S.data[--S.top2]=x; //棧2有元素進棧 return true; }