Parentheses Balance |
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
经典的括号匹配问题,渣渣惭愧地错了两遍。。。。。。
开出一个栈,用来存放从前到后的前括号。
括号不匹配,有三种情况:
(1)找到后括号,但是栈顶的前括号和改后括号不匹配。
(2)找到后括号,但是栈内已经没有括号了。
(3)字符串遍历完了,但是站内还没有空,即还有前括号没有与之对应。(丢掉的就是这种情况,开始还以为是应为字符串内有括号没有处理掉呢,后来又仔细读了读题,发现题目中只有这两种括号,没有其他字符。)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char zhan[200],ss[200];
int top,low,i,j,l;
scanf("%d",&j);
getchar();
while(j--)
{
int bj = 1;
gets(ss);
memset(zhan,0,sizeof(zhan));
top = low = -1;
l = strlen(ss);
for(i = 0; i < l; i++)
{
if(ss[i] == '(' || ss[i] == '[')
{
zhan[++top] = ss[i];
}
else if(ss[i] == ')')
{
if(zhan[top] == '(')
top--;
else
{
bj = 0;
break;
}
}
else if(ss[i] == ']')
{
if(zhan[top] == '[')
top--;
else
{
bj = 0;
break;
}
}
else
{
bj = 0;
break;
}
}
if(i == l && top != low)
bj = 0;
if(bj == 0)
{
printf("No\n");
}
else
{
printf("Yes\n");
}
}
return 0;
}