1. 程式人生 > >括號匹配(棧)

括號匹配(棧)

括號配對問題

時間限制:3000 ms  |  記憶體限制:65535 KB

難度:3

輸入

第一行輸入一個數N(0<N<=100),表示有N組測試資料。後面的N行輸入多組輸入資料,每組輸入資料都是一個字串S(S的長度小於10000,且S不是空串),測試資料組數少於5組。資料保證S中只含有"[", "]", "(", ")" 四種字元

輸出

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

樣例輸入

3
[(])
(])
([[]()])

樣例輸出

No
No
Yes

描述

現在,有一行括號序列,請你檢查這行括號是否配對。

通過這一道題可以更直觀的瞭解到棧的運用

棧的標頭檔案為#include<stack>

如果定義棧為s

入棧:s.push() 出棧:s.pop()

訪問棧頂元素:s.top() 計算棧內元素s.size()

s.empty()判斷棧內是否為空

#include <iostream>
#include <stdio.h>
#include <stack>
#include <string.h>
using namespace std;
int main()
{
    stack<char> s;
    int a,i;
    char b[10000];
    scanf("%d",&a);
    while(a--)
    {
        while(!s.empty())
            s.pop();
        scanf("%s",&b);
        for(i=0;i<strlen(b);i++)
        {
            if(b[i]=='('||b[i]=='[')
                s.push(b[i]);
            else if(!s.empty())
            {
                if(b[i]==')'&&s.top()=='('||b[i]==']'&&s.top()=='[')
                {s.pop();}
                else break;
            }
            else break;
        }
        if(i==strlen(b))
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}