p.s.个人收录用
题目描述
字符串中只含有括号 (),[],<>,{},判断输入的字符串中括号是否匹配。如果括号有互相包含的形式,从内到外必须是<>,(),[],{},例如。输入: [()] 输出:YES,而输入([]), ({})都应该输出NO。
输入
文件的第一行为一个整数n,表示以下有多少个由括号组成的字符串。接下来的n行,每行都是一个由括号组成的长度不超过255的字符串。
输出
在输出文件中有N行,每行都是YES或NO。
样例输入 Copy
5 {}{}<><>()()[][] {{}}{{}}<<>><<>>(())(())[[]][[]] {{}}{{}}<<>><<>>(())(())[[]][[]] {<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]] ><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
样例输出 Copy
YES YES YES YES NO
代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char size[5] = { '<','(','[','{' };
typedef struct sstack {
char* data;
int top;
}mystack;
mystack init(int n)
{
mystack s;
s.data = (char*)malloc(n * sizeof(char));
if (s.data != NULL)
s.top = -1;
return s;
}
int is(mystack s)
{
if (s.top == -1)//空
return 1;
else
return 0;
}
int isN(mystack s)
{
int k = 0;
while (1)
{
while (s.data[s.top] != size[k])
{
k++;
if (k == 4)
break;
}
for (int i = s.top-1; i >= 0; i--)
{
while (s.data[i] != size[k])
{
k++;
if (k == 4)
return 0;
}
}
return 1;
}
}
void ppush(mystack* s, char a, int n)
{
if (s->top != n - 1)//判满
{
s->top++;
s->data[s->top] = a;
}
}
int ppop(mystack* s, char a)
{
if (is(*s))
return 0;
else
{
if ((s->data[s->top] == 40 && a == 41) || s->data[s->top] == (int)a - 2)
{
s->top--;
return 1;
}
else
return 0;
}
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
char a[300] = { 0 };
scanf("%s", a);
int l = strlen(a);
mystack s = init(l);
int flag = 1;
for (int i = 0; i < l; i++)
{
if (a[i] == '(' || a[i] == '[' || a[i] == '<' || a[i] == '{')
{
ppush(&s, a[i], l);
flag = isN(s);
}
else if (a[i] == ')' || a[i] == ']' || a[i] == '>' || a[i] == '}')
flag = ppop(&s, a[i]);
if (!flag)
break;
}
if (flag == 1 && is(s) == 1)
printf("YES\n");
else
printf("NO\n");
}
}