K 括号括号
时间限制 内存限制 出题人
1Second 512Mb 刘帅坤
题目描述
小明今年上大学,在大学里发现有很多同学都女朋友,两人整天都在一起腻歪,小明看到后感
觉很孤单,现在,给你一行括号序列,你来判断一下其中的括号是否配对。
输入
第一行输入一个数 N (0< N< 100)表示有N组测试数据。后面的N行输入多组输入数据,每组
输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保
证S中只含有”[“,”]”,”(“,”)” 四种字符 ,输入以“EOF”结束。
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则
输出No。
输入样例
3
[(])
(])
([])
输出样例
No
No
Yes
注意:此题的测试数据组是多组的。
括号匹配AC代码(c语言数据结构写法)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define STACK_INIT_SIZE 10000
#define STACKINCREMENT 10
typedef struct{
char *top;
char *base;
int stacksize;
}SqStack;
int initstack(SqStack &S)
{
S.base=(char*)malloc(STACK_INIT_SIZE * sizeof(char));
if(!S.base)
return 0;
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return 1;
}
int pop(SqStack &S)
{
char e;
if(S.top==S.base)
return 0;
e=*--S.top;
return 1;
}
int stackempty(SqStack &S)
{
if(S.top==S.base)
return 1;
if(S.top!=S.base)
return 0;
}
int push(SqStack &S,char e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(char*)realloc(S.base,(S.stacksize+STACKINCREMENT* sizeof(char)));
S.base=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return 1;
}
int gettop(SqStack &S)
{
char e;
if(S.top==S.base)
return 0;
e=*(S.top-1);
return e;
}
int main()
{
SqStack S;
char ch[10000],*p;
int answer;
int n;
while(scanf("%d",&n)!=EOF)
{
getchar();
while(n--)
{
scanf("%s",ch);
{
initstack(S);
answer=0;
p=ch;
while(*p!='\0')
{
if(*p=='[')
push(S,*p);
else if(*p=='(')
push(S,*p);
else if(*p==']')
{
if(gettop(S)=='[')
pop(S);
else
{
answer=1;
break;
}
}
else if(*p==')')
{
if(gettop(S)=='(')
{
pop(S);
}
else
{
answer=1;
break;
}
}
else
{
answer=1;
break;
}
p++;
}
if(answer==0&&stackempty(S))
printf("Yes\n");
else
printf("No\n");
}
}
}
return 0;
}
括号匹配AC代码(c++stl中的stack写法)
#include<stdio.h>
#include<iostream>
#include<stack>
#include<string.h>
const int N=10000+1;
using namespace std;
stack<char>sk;
char str[N];
int main()
{
int T,answer;
while(~scanf("%d",&T))
{
getchar();
while(T--)
{
answer=0;
while(!sk.empty())
sk.pop();
memset(str,0,sizeof(str));
gets(str);
int len=strlen(str);
for(int i=0;i<len;i++)
{
if(str[i]=='['||str[i]=='(')
sk.push(str[i]);
else if(str[i]==']')
{
if(sk.top()=='[')
sk.pop();
else
{
answer=1;
break;
}
}
else if(str[i]==')')
{
if(sk.top()=='(')
sk.pop();
else
{
answer=1;
break;
}
}
}
cout<<sk.size()<<endl;
if(answer==0&&sk.empty())
printf("Yes\n");
else
printf("No\n");
}
}
return 0;
}
思路:只要是左括号都入栈,当遇到右括号就判断它的栈顶元素是否为对应的左括号,如果是把栈顶元素出栈,不是则把answer置为1,只要有一个不匹配则无需再进行下去。
判断是否完全匹配,则看是否answer=0,因为一旦有不匹配的,则answer会=1,并且栈必须为空,为什么呢?比如((),此时遇到右括号他们是匹配的,但是多出一个左括号,如果不加上栈为空的条件则会判断这种情况是正确的,但其实是错误的。
光有一个栈是否为空行不行?不行,比如())的情况,遇到右括号出栈,此时栈为空,但并不完全匹配。
所以必须两个条件都满足。
这仅是一个思路,其它的写法也可以。