法一:数组解决问题
#include<stdio.h>
#include <string.h>
int main()
{
int k;
int i;
scanf("%d",&k);
getchar();
while(k--)
{
char a[10000],b[10000];
int t=-1;
gets(a);
int len=strlen(a);
for(i=0;a[i]!='\0';i++)
{
if(len%2!=0)
{
printf("No\n");
break;
}
else
{
if(a[i]=='(' || a[i]=='[')
{
t++;
b[t]=a[i];
}
else
if(t==-1 || t>len/2)
{
printf("No\n");
break;
}
else
{
if(b[t]=='(' && a[i]==')' || b[t]=='[' && a[i]==']')
{
t--;
}
}
}
}
if(i==len)
{
if(t==-1)
printf("Yes\n");
else
printf("No\n");
}
}
return 0;
}
法二:调用函数——链栈
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define Maxsize 11000
struct Node
{
char data;
Node *next;
};
Node *top=NULL;
char Stack_getTop()
{
//printf("top\n");
if(top->next!=NULL)
return top->next->data;
else return '0';
}
void Stack_Pop()
{
//printf("pop\n");
Node* del=top->next;
if(del!=NULL)
{
top->next=del->next;
free(del);
}
}
void Stack_Push(char data)
{
//printf("push\n");
Node* one=(Node *)malloc(sizeof(Node));
one->data=data;
one->next=top->next;
top->next=one;
}
void Stack_DelAll()
{
//printf("del\n");
while(Stack_getTop()!='0')
{
Stack_Pop();
}
}
char ch[Maxsize];
int main()
{
int N;
int i;
scanf("%d",&N);
getchar();
top=(Node *)malloc(sizeof(Node));
top->next=NULL;
while(N--)
{
gets(ch);
int len=strlen(ch);
if(len%2==1)
{
printf("No\n");
continue;
}
for(i=0;i<len;i++)
{
if(ch[i]=='['||ch[i]=='(')
{
Stack_Push(ch[i]);
}
else
{
if(Stack_getTop()=='['&&ch[i]==']'||Stack_getTop()=='('&&ch[i]==')')
{
Stack_Pop();
}
else break;
}
}
if(i==len)
printf("Yes\n");
else
printf("No\n");
Stack_DelAll();
}
return 0;
}