UVA 673
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
一开始自己做的时候超时,后来发现是自己每次都去清空栈,因为STL里面没有栈清空的函数,所以自己去写了一个函数,不知道什么原因总是超时。原因有待考证。后来就WA,发现问题竟然非常的坑爹。竟然是没有考虑空行的情况,那种情况下应该输出Yes的。而我一开始写的代码使用scanf去读取的,会自动忽略换行和空格,这种情况是没有办法读到的。所以后来改用fgets马上就A了
UVA:Run time:0.048s
#include <cstdio>
#include <stack>
#include <cstring>
using namespace std;
#define MAXN 150
char s[MAXN];
int main()
{
int n,i=0;
scanf("%d",&n);
getchar();
int len,j;
char temp;
while(fgets(s,sizeof(s),stdin)!=NULL) //千万要用fgets,血的教训
{
len=strlen(s)-1;
j=0;
stack<char> ss; //利用栈进行符号的存放
while(j<len)
{
if(ss.empty())
ss.push(s[j]);
else
{
if(s[j]==')')
temp='(';
else if(s[j]==']')
temp='[';
else
temp=NULL;
if(temp==ss.top())
{
ss.pop(); //出栈
}
else
{
ss.push(s[j]); //入栈
}
}
j++;
}
if(ss.empty())
printf("Yes\n");
else
printf("No\n");
i++;
if(i==n)
break;
}
}