棧結構具有後進先出的固有特性,在程式設計中很有幫助。這裡舉乙個例子,將棧應用與括號匹配的檢驗。
假設表示式中允許三種括號:小括號、中括號和大括號,巢狀的順序任意。( [ ] ) 、[ ]等均為正確格式。檢驗括號是否匹配可用「期待的急迫程度」來描述。接收乙個正括號後,計算機期待著乙個與之匹配的反括號。如果此時接收到乙個反括號,若與期待的匹配,則這種「期待」得到消解;否則括號匹配失敗。如果又接收到乙個左括號,則之前的括號暫時不尋求匹配,讓位於新的左括號,等到新的左括號得到匹配之後,在讓之前的括號尋求匹配,以此類推。這個處理過程正好符合棧後進先出的特點。因此,我們可以設定乙個棧,每讀入乙個左括號,則將該括號壓入棧內;如果讀到右括號,則與棧頂的左括號進行匹配檢驗,若成功,則棧彈出乙個元素,否則整個式子匹配失敗,結束。如果可以遍歷完最後乙個元素,則棧應該是空的,說明整個式子括號匹配是成功的;否則說明還有左括號沒有被匹配,匹配失敗。
知道了處理方法之後,我們就可以編寫程式實現了。這裡採用c++編寫。使用標準庫中的stack類,需要包含標頭檔案。其用法如下:
stacks;//建立乙個元素型別為elemtype的棧s
s.push(elem1);//將元素elem1壓入棧
elem2=s.pop();//彈出並返回棧頂元素
elem3=s.top();//返回棧頂元素的引用(而不彈出)
s.empty(); //判斷棧是否為空,返回布林型別值
s.clear();//清空棧
應用例項如下:
測試樣例1:#include //#include #include using namespace std;
bool judge(const char *);
char gettype(const char);
bool match(const char,const char);
int main()
else if( brackettype == 'r' )
}//判斷棧內是否還有左括號,若無,則匹配成功
if(s.empty()) return true;
else return false;
}
輸入:(2+3*)
輸出:succeeded
測試樣例2:
輸入:()
輸出:failed
遞迴應用之括號匹配檢驗
括號匹配檢驗還可以用棧來解決,參見我的另一篇文章 棧的應用之括號匹配檢驗 這裡給出乙個c 程式,結合注釋來看是如何實現的。include using namespace std bool judge char str 括號檢驗主體函式 bool match char char,int 遞迴呼叫的匹配...
棧的應用 括號匹配檢驗
輸入包含括號的表示式,包含3中括號 圓括號 方括號,大括號 其巢狀順序隨意,即 或 等均為正確的輸入格式,檢驗輸入表示式中的括號是否匹配。源 bracketmatch.h ifndef bracketmatch h define bracketmatch h define maxsize 100 t...
棧的應用之括號匹配
在許多正文中都有括號,特別是在表示程式 數學表示式的正文片段裡,括號有正確配對問題。作為例子,下面考慮python程式裡的括號,在這裡可以看到 不難總結出檢查括號配對的原則 在掃瞄正文過程中,遇到的閉括號應該與此前最近遇到且尚未獲得匹配的開括號配對。如果最近的未匹配開括號與當前閉括號不配對,或者找不...