【C++题解】括号匹配(bracket)

P a r t Part Part 1 1 1 读题

题目描述

为了让 t y w z tywz tywz的同学们更富有智慧,贤者 w g y wgy wgy决定开设计算机基础、C语言程序设计、数据结构等课程。下头男 w h y why why听说课上可以玩电脑,于是兴冲冲地把有实力的 a y b ayb ayb拉上,报名参加了C语言基础课程

下头男 w h y why why当然什么都听不懂(毕竟他的智商只有 − 1145141919810 -1145141919810 1145141919810),所以每次上课他都全程跟有实力的 a y b ayb ayb玩斗地主,下课后请其他同学帮他写作业。 9 9 9个月后他把 t y w z tywz tywz所有的同学都委托了一遍,现在他找不到别人,只能再次找你了。

这次的作业是这样的:给你一个括号序列,其中有圆括号 ( ) () ()、方括号 [ ] [] []、花括号 {} 和尖括号 < > <> <>,请问该序列是否合法。

合法的括号序列可以按如下方式递归定义:

1. 1. 1.空序列是合法的;

2. 2. 2. A A A B B B是合法的括号序列,则 A B AB AB(将 B B B连接到 A A A的后方)也是合法的括号序列;

3. 3. 3. A A A是合法的括号序列,则在两端添加一对括号 ( A ) (A) (A) [ A ] [A] [A] A {A} A < A > <A>都是合法的括号序列。

输入格式

第一行是一个正整数 T T T,表示数据组数;

之后 T T T行,每行包含一个字符串,表示待判断的括号序列。保证字符串非空且只会包含 ( ) [ ] < > ()[]{}<> ()[]<> 8 8 8种字符。

输出格式

对于每组数据,若该序列是合法的则输出 Y e s Yes Yes,否则输出 N o No No

输入样例

3
(([]))
([(]))
{<><>}<{{(}}>)

输出样例

Yes
No
No

数据范围与提示

T ≤ 1 0 5 T≤10^{5} T105,所有测试数据的序列长度之和 ≤ 1 0 6 ≤10^{6} 106

本题共 10 10 10组测试文件,部分满足如下的附加限制条件:

测试点 1 − 3 1-3 13:序列中只包含圆括号

测试点 1 − 6 1-6 16 T ≤ 30 T≤30 T30

测试点 4 4 4:每个序列长度 ≤ 100 ≤100 100

测试点 1 、 5 、 6 1、5、6 156:每个序列长度 ≤ 1000 ≤1000 1000

P a r t Part Part 2 2 2 思路

本题较为简易,不需要判断大小,只需要判断括号是否正确,满足就输出 Y e s Yes Yes,不满足就输出 N o No No

P a r t Part Part 3 3 3 代码

#include
using namespace std;
int top,t,d[5];
char s[10000005],a[10000005];
bool f;
int main(){
    scanf("%d",&t);
    for(int i=1;i<=t;i++){
        cin>>a;
        f=true;
		top=0;
        int len=strlen(a);
        d[1]=0,d[2]=0,d[3]=0,d[4]=0;
        for(int j=0;j<len;j++){
            if(f==false)break;
            if(a[j]=='<'){
                d[1]++;
                s[++top]=a[j];
            }
			else if(a[j]=='('){
                d[2]++;
                s[++top]=a[j];
            } 
			else if(a[j]=='['){
                d[3]++;
                s[++top]=a[j];
            } 
			else if(a[j]=='{'){
                d[4]++;
                s[++top]=a[j];
            } 
			else if(a[j]=='>'){
                if(s[top]=='<'&&d[1] != 0){
                    top--;
                    d[1]--;
                } 
				else{
                	printf("No\n");
   					f=false;
    				break;
				}
            } 
			else if(a[j]==')'){
                if(s[top]=='('&&d[2]!=0){
                    top--;
                    d[2]--;
                } 
				else{
                	printf("No\n");
   					f=false;
    				break; 
				}
            } 
			else if(a[j]==']'){
                if(s[top]=='['&&d[3]!=0){
                    top--;
                    d[3]--;
                } 
				else{
                	printf("No\n");
   					f=false;
    				break; 
				}    
            } 
			else if(a[j]=='}'){
                if(s[top]=='{'&&d[4]!=0){
                    top--;
                    d[4]--;
                } 
				else{
                	printf("No\n");
   					f=false;
    				break; 
				}       
            }
        }
        if(top==0&&f==true)printf("Yes\n");
        if(top!=0&&f==true)printf("No\n");
    }
    return 0;
}

听完后,是不是觉得很简单呢?赶快自己去试一下吧!!!

你可能感兴趣的:(C++题解,#,栈与深度优先搜索,c++,算法,开发语言)