括号匹配

括号匹配

时间限制: 1 Sec 内存限制: 0 MB
提交: 41 解决: 17
[提交][状态][讨论版]
题目描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
多组输入数据, 每组输入数据都是一个字符串S(S的长度小于10000, 且S不是空串), 数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的, 则输出Yes,如果不配对则输出No
样例输入

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

样例输出

No
No
Yes

网址 http://nyoj.top/problemset
题意:查找一行括号序列是否匹配
思路:首先我们可以先把这一行括号序列存在字符串中,计算字符的长度,并用一个标志位标志括号匹配的情况,然后判断字符串的长度是否是偶数(奇数不可能匹配),用一个fou循环遍历每一个括号,如果是左括号就把它存入另一个数组中,如果是右小括号就判断它的前一个括号是否为左小括号,否就结束循环并把标志位变一下,是就把它减掉。如果是右大括号同理。最后判断标志位,否就是no,是 再判断字符串的长度是否为0(因为可能出现((((((【【】】))这种情况),是yes,否no。
代码
方法一:stack

 #include<iostream>                                      //c++的头文件
    #include<stack>                                            //栈的头文件
    #include<string>                                         //字符串的头文件
    using namespace std;
    int main()
    {
       string a;                       //定义一个字符串a
       stack<char> s;                      //定义一个字符型的栈s
       int n,flag;
       cin>>n;
       while(n--)
       {
           flag=1;                                             //标志位
           while(!s.empty())                           //栈不为空的时候循环(清空栈中的元素以便存入新的元素)
           {
               s.pop();                                   //输出首元素
           }
           cin>>a;                             //输入字符串a
           for(int i=0;i<a.length();i++)
           {
               if(a[i]=='('||a[i]=='[')                      //如果是左括号把它(a[i])存在栈里面
                {
                    s.push(a[i]);
                }
                else                          //如果是右括号
                {
                    if(s.size()==0)                          //如果没有左括号也没有右括号(即这种情况“[[[[[[”)
                    {
                        flag=0;
                        break;
                    }
                    if((s.top()=='['&&a[i]==']')||(s.top()=='('&&a[i]==')'))       //左括号存完之后,找与之相配的右括号。如果相匹配输出
                            s.pop();
                        else                                //如果不匹配,
                        {
                            flag=0;
                            break;
                        }
                }
           }
       if(flag==0||(!s.empty()))           //如果flag=0(不匹配)或者栈不为空(无法匹配完例如“{{{{{{{[[]]}")
            cout<<"No"<<endl;
       else
        cout<<"Yes"<<endl;
       }
    return 0;
    }

方法二:数组

#include<stdio.h>//c语言头文件
#include<string.h>  //字符串函数头文件
int main()
{
	char a[10000],b[10000];//定义两个字符数组
	int i,j,flag=1,t;
	while(scanf("%s",a)!=EOF)//多实例测试
	{
		flag=1;j=0;
		t=strlen(a);//求出字符串的长度
		if (t%2==0)//字符串的长度为偶数才可能匹配
		{
			for(i=0;i<t;i++)
			{
				if(a[i]=='('||a[i]=='[')//如果是左括号把它存到另一个数组b[i]里面
				{
					j++;
					b[j]=a[i];
				    
				}
				if(a[i]==')')//如果是右小括号,找与之匹配的左小括号
				{
					if(b[j]=='(')//如果匹配,减掉
						j--;
					else//否则,把标志位变成0,结束循环
					{
						flag=0;break;}
				}
				if(a[i]==']')//如果是右大括号,找与之匹配的左大括号
				{
					if(b[j]=='[')//如果匹配,减掉
						j--;
					else//否则,把标志位变成0,结束循环
					{
						flag=0;break;
					}
				}
			}
	    	if(flag==0)
		    	printf("No\n");
	    	else
			{
		    	if(j==0)
			    	printf("Yes\n");
		     	else//j不等于0即没有匹配完(例如“[[[[[{{{{}}]]”)
			    	printf("No\n");
			}
		}
		else//奇数不可能匹配成功
				printf("No\n");

	
	}
	return 0;
}
**运算结果**

在这里插入图片描述
总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值