括號配對問題

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

輸入:

3
[(])
(])
([[]()])
輸出:

No

No

Yes


還要注意幾種特殊的組合  ]]]]()和[]]]

這個題用到數據結構中的棧,當然用stl裏#include<stack>現成的函數方便很多。

原理是:利用棧先進後出,後進先出的特點,當括號爲左括號時,把它放入棧用

push(),當不是左括號時,就用它與棧頂元素配對,即最後放進棧的左括號,若

配對就繼續,否則就可以輸出No了。中間有很多細節,詳見代碼註釋。


代碼:

#include<stdio.h>
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
char a[10000];
bool match(char a,char c)              //判斷是否配對
{
    if(a=='['&&c==']'||a=='('&&c==')')
        return 1;
    else
        return 0;
}
void p(char *str)
{
    stack<char> s;         //建立一個棧
    if(str[0]==']'||str[0]==')')         //若一開始就是右括號就輸出並返回
    {
        printf("No\n");
        return ;
    }
    for(int i=0; str[i]!='\0'; i++)
    {
        if(str[i]=='['||str[i]=='(')            //如果是左括號就存入棧
        {
            s.push(str[i]);
            continue;
        }
        if(s.empty())            //如果進來的是右括號,即棧內爲空,就是右括號多餘輸出NO
        {
            printf("No\n");
            return;
        }
        else
        {
            if(match(s.top(),str[i]))         //如果是右括號,並且配對,就把左括號踢出。
                s.pop();
            else
           {
               printf("No\n");       //如果不配對,就輸出No
               return;
        }
        }
    }
    if(s.empty())                 //如果最後棧內爲空,就配對
        printf("Yes\n");
    else
        printf("No\n");
}
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%s",a);
        p(a);
    }
    return 0;
}



發佈了39 篇原創文章 · 獲贊 6 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章