You are given a string consisting of parentheses () and []. A string of this type is said to be correct:
(a) if it is the empty string
(b) if A and B are correct, AB is correct,
(c) if A is correct, (A ) and [A ] is correct.
Write a program that takes a sequence of strings of this type and check their correctness. Your program can assume that the maximum string length is 128.
Input
The file contains a positive integer n and a sequence of n strings of parentheses () and [], one string a line.
Output
A sequence of Yes or No on the output file.
Sample Input
3
( [ ] )
( ( [ ( ) ] ) ) )
( [ ( ) [ ] ( ) ] ) ( )
Sample Output
Yes
No
Yes
题意:输入包含小括号和中括号的括号序列,是否合法。
空序列和括号匹配合法输出Yes 否则输出No;
实现代码
#include <cstdio>
#include <cstring>
const int maxn = 130;
char str1[maxn];
char str2[maxn];
int main()
{
int i, n, top, len;
scanf("%d", &n);
getchar(); //去除\n
while (n--)
{
gets(str2);
len = strlen(str2);
if (len == 0)
{
printf("Yes\n");
continue;
}
for (top = 0, i = 0; i<len; i++)
{
if (str2[i] != '(' && str2[i] != ')' && str2[i] != '[' && str2[i] != ']') // 判断str2中的是否为括号符,否则退出此次循环
continue;
str1[top] = str2[i]; //将第一个括号符压入栈底,top指向栈底
if (top == 0) // 栈底只有一个元素,使top指向第二个元素
{
top++;
continue;
}
if ((str1[top - 1] == '(' && str1[top] == ')') || (str1[top - 1] == '[' &&str1[top] == ']')) //判断是否有匹配的括号符,则top指向栈前元素,否则top自加1
top--;
else
top++;
}
if (top <= 0)
printf("Yes\n"); //top=0或者-1 则符合平衡 输出Yes 否则输出No
else
printf("No\n");
}
return 0;
}