利用棧檢測括號的配對情況
阿新 • • 發佈:2018-12-27
在程式語言中經常使用的括號有()、[ ]、{ } 這三種,怎麼用程式來判斷在程式中或者其他情況下這三種括號的配對情況呢?
首先來看一下,括號的匹配情況有如下四種:
1、左右括號不匹配--------比如 ( ( abc ) ) 12 [ { ] }
2、左括號比右括號多-------比如 { [ ((ab13) ] }
3、右括號比左括號多-------比如 ([ ]){ 123 } }
4、左右括號匹配成功-------比如 { [ ( 123abc ) ] }
接下來來討論一下怎麼去區分這四種情況。
要利用棧來去實現這個過程,那麼,首先一定得要明白棧是先進後出或者說是後進先出的特點,明白了這一點,我們再來繼續看。
這個包含各種括號的語句其實就相當於一個字串,那麼,我們從第一個字元開始遍歷。如果不是括號的話繼續往後走,是括號的話就對它進行判斷,是左括號還是右括號。左括號的話就將其壓入棧中暫時存起來,是右括號的話就讓它和棧頂的字元進行比對,在比對之前呢首先得判斷一下棧是否為空吧,為空的話很顯然右括號就比左括號多了,則為第二種情況,根本就不需要繼續比對了。棧不為空的話就看該個右括號與棧頂裡的括號是否匹配,如果不匹配的話,就是第一種情況,左右括號次序不匹配。匹配的話就繼續往後走。當整個“字串都遍歷完了”,只需對檢測棧是否為空,就能將剩下的兩種情況區分出來了,棧不為空,說明左括號比右括號多,棧為空,那麼,匹配成功!
接下來看程式碼:
#include <iostream> #include <assert.h> #include <stack> using namespace std; bool IsBrackets(char ch)//用於判斷是否為括號 { if (ch == '(' || ch == ')' || ch == '[' || ch == ']' || ch == '{' || ch == '}') { return true; } return false; } bool MatchBrackets(char* pstr)//檢測括號匹配情況 { assert(NULL != pstr); stack<char> s; size_t len = strlen(pstr); for (size_t i = 0; i < len; i++) { //不是括號的話就繼續往後走 if (!IsBrackets(pstr[i])) continue; else { //是左括號就入棧,然後往後走 if (pstr[i] == '(' || pstr[i] == '[' || pstr[i] == '{') { s.push(pstr[i]); } //是右括號 else { //首先判段棧是否為空 //為空則表示右括號多於左括號 if (s.empty()) { cout << "右括號多於左括號" << endl; return 0; //返回0沒有什麼實際意義,只是為了終止程式 } //配對成功,棧頂元素出棧 else if (pstr[i] == ')'&&s.top() == '(' || pstr[i] == ']'&&s.top() == '[' || pstr[i] == '}'&&s.top() == '{') { s.pop(); } else { cout << "左右括號次序不匹配" << endl; return 0; } } } } //判斷棧是否為空,不為空代表左括號多於右括號 if (!s.empty()) { cout << "左括號多於右括號" << endl; return 0; } else return true; }
void FunTest()
{
char* str1 = "((abc))[{]}";
char* str2 = "()cd()){[]}";
char* str3 = "[[]()ef{}";
char* str4 = "{[]}[(gg)]()";
MatchBrackets(str1);
MatchBrackets(str2);
MatchBrackets(str3);
MatchBrackets(str4);
}
int main()
{
FunTest();
return 0;
}
上邊的FunTest函式中,可以看出,第一個是左右括號次序不匹配的,第二個是右括號多於左括號的,第三個是左括號多於右括號的,第四個則是匹配成功地。