棧的應用之括號匹配的檢驗

題目信息:假設表達式中允許包含兩種括號,圓括號和方括號,其嵌套的順序隨意,即( [ ]( ))或[ ( [ ] [ ] ) ]等爲正確的格式,[ ( ]或( ( ) ] )均爲不正確的格式。

輸入:

        第一行輸入一個數N(0<N<=100),表示有N組測試數據,後面的N行表示輸入多組數據,每組輸入數據都是一個字符串S(S的長度小於10000,且不爲空串)。

輸出:

        每組輸入數據的輸出佔一行,如果該字符串中所含的括號是配對的,則輸出Yes,如果不配對則輸出No

#include <iostream>
using namespace std;
#include <stack>
#include <string.h>
char S[10001];
bool Matching()         //類型爲布爾型的函數,檢驗表達式中所含括弧是否正確嵌套,若是返回TRUE;否則返回FALSE
{
cin >> S;
int state = 1;
stack<char> val;                                             //stack<char> val;這是參數化模板,聲明存放char類型的stack容器
for ( int i = 0; i < strlen(S) && state == 1 ; i++ ) 
{
	if ( S[i] == '[' || S[i] == '(' )
    val.push(S[i]);                                        //入棧,若是左括弧一律壓入棧中,插入元素i爲新的棧頂元素             
    if ( S[i] == ')' )
	{
		if ( !val.empty() && val.top() == '(' )     //empty是stack的一個方法,此處的作用是用來判斷val這個對象中是否爲空
                                                           //如果val這個容器對象中一個元素都沒有保存,那麼返回true,否則返回false
                                                          //所以你要使用這個方法就應該用一個bool變量接受返回值纔有意義
		  
			val.pop();                       //出棧,刪除val的棧頂元素
		
       else
		    state = 0;

}

    if ( S[i] == ']' )
   {
    	if ( !val.empty() && val.top() == '[' )
    
	       val.pop();
	
       else
		  state = 0;

}
}

   if ( val.empty() && state) 

	return true;

   else
	   return false;
}

int main()                                //主函數調用Matching()函數
{
int n;
cin >> n;
while ( n-- )
{
if ( Matching() == true )
cout << "Yes" << endl;
else
cout << "No" << endl;
}

return 0;
}
題目分析:正確寫出解題代碼需要我們從3個方面思考,(1)檢驗括號是否正確匹配的方法可以用”等待的急迫程度“予以理解(這種思路大家在下面自行了解,這裏不再細說)(2)在算法的開始和結束時,棧都應該是空的 (3)注意if與else的使用,不可混亂

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章