題目信息:假設表達式中允許包含兩種括號,圓括號和方括號,其嵌套的順序隨意,即( [ ]( ))或[ ( [ ] [ ] ) ]等爲正確的格式,[ ( ]或( ( ) ] )均爲不正確的格式。
輸入:
第一行輸入一個數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的使用,不可混亂