括号配对问题 用数组解决

题目连接:http://acm.nyist.net/JudgeOnline/problem.php?pid=2

这个题目有很多的解法,用数据结构中的栈,模板,容器,其实归根到底还是可以用很简单的数组来解决。

题目的关键是:如果这个输入合法,那么一组输入中一定有 “[]”或者“()”这样的,有这样的就简化,去掉,最后这个数组为空就是正解。

先开一个辅助数组,然后从原数组中提取,如果是“[”或者“(”存进辅助数组里面去,如果不是看前面的那个元素能不能把现在这元素消去,如果不可以表示这组数据不行。

#include <iostream>
#include <string.h>
using namespace std;
int main()
{
	int t;
	char k[10001];
	char c[10005]; //辅助数组    
 	cin>>t;
	while(t--)
	{
	  cin>>k;
	  int len,clen(0); //clen 辅助数组的长度 
   	  len=strlen(k);
	  if(k[0]==']'||k[0]==')')
  		{
		  cout<<"No"<<endl;
		  continue; 	
	    }
	  c[clen]=k[0];  
	  for(int i=1;i<len;i++)
	  {
	  	if(k[i]=='['||k[i]=='(')
		  {clen++;
		   c[clen]=k[i];	
		  }	
  	    if(k[i]==']')
		  {
 		   if(c[clen]=='[')
			clen--;
		   else 
		   {
		   	clen=10;
   			continue;
   		   }
		    		
          }	
	    if(k[i]==')')
	      {
     	   if(c[clen]=='(')
		    clen--;
		   else
		    {
		   	clen=10;
   			continue;
   		   }
        		
     	 }  
  	  }	
  	  //cout<<clen<<endl;
if(clen<0)
  	   cout<<"Yes"<<endl;
  	  else
	   cout<<"No"<<endl;	 
	}
	return 0;
}


 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值