棧的應用之括號匹配檢驗

2021-06-29 14:04:45 字數 1177 閱讀 9637

棧結構具有後進先出的固有特性,在程式設計中很有幫助。這裡舉乙個例子,將棧應用與括號匹配的檢驗。

假設表示式中允許三種括號:小括號、中括號和大括號,巢狀的順序任意。( [ ] ) 、[ ]等均為正確格式。檢驗括號是否匹配可用「期待的急迫程度」來描述。接收乙個正括號後,計算機期待著乙個與之匹配的反括號。如果此時接收到乙個反括號,若與期待的匹配,則這種「期待」得到消解;否則括號匹配失敗。如果又接收到乙個左括號,則之前的括號暫時不尋求匹配,讓位於新的左括號,等到新的左括號得到匹配之後,在讓之前的括號尋求匹配,以此類推。這個處理過程正好符合棧後進先出的特點。因此,我們可以設定乙個棧,每讀入乙個左括號,則將該括號壓入棧內;如果讀到右括號,則與棧頂的左括號進行匹配檢驗,若成功,則棧彈出乙個元素,否則整個式子匹配失敗,結束。如果可以遍歷完最後乙個元素,則棧應該是空的,說明整個式子括號匹配是成功的;否則說明還有左括號沒有被匹配,匹配失敗。

知道了處理方法之後,我們就可以編寫程式實現了。這裡採用c++編寫。使用標準庫中的stack類,需要包含標頭檔案。其用法如下:

stacks;//建立乙個元素型別為elemtype的棧s

s.push(elem1);//將元素elem1壓入棧

elem2=s.pop();//彈出並返回棧頂元素

elem3=s.top();//返回棧頂元素的引用(而不彈出)

s.empty(); //判斷棧是否為空,返回布林型別值

s.clear();//清空棧

應用例項如下:

#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;

}

測試樣例1:

輸入:(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程式裡的括號,在這裡可以看到 不難總結出檢查括號配對的原則 在掃瞄正文過程中,遇到的閉括號應該與此前最近遇到且尚未獲得匹配的開括號配對。如果最近的未匹配開括號與當前閉括號不配對,或者找不...