题干:
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. Yourprogram 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 stringa line.
Output
A sequence of ‘Yes’ or ‘No’ on the output file.
Sample Input
3
([])
(([()])))
([()[]()])()
Sample Output
Yes
No
Yes
思路:
这道题一开始的想法是找出那些不合适的情况,排除掉他们,剩下的都是Yes。但在写的时候忽略了空串的情况,导致一开始没做出来。而且这个地方不能使用scanf("%s",a) 和cin,他们读不了'\n',用这两个就无法解决空串的情况。所以这个地方用gets或者一个字符一个字符的读入。gets有的地方不能用,会编译错误,这个题中编译器选择 C++11 5.3.0 就可以。后来看了题解发现这个题也可以用栈做,不过刚开始也是没考虑到空串的情况。
非栈的代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
// 奇数× ][ [(]) [[((]]))
int cmp(int a,int b)
{
return a>b;
}
int main()
{
int n;
char a[140];
cin>>n;
getchar();
while(n--){
int l1=0,r1=0,l2=0,r2=0;
gets(a);
int fl1=0,fl2=0,flag=0;
int l=strlen(a);
for(int i=0;i<l;i++)
{
if(a[i]=='(')
{
l1++;
fl1++;
}
else if(a[i]==')')
{
r1++;fl1--;
}
else if(a[i]=='[')
{
l2++;fl2++;
}
else if(a[i]==']')
{
r2++;fl2--;
}
if(fl1<0||fl2<0||a[i]=='('&&a[i+1]==']'||a[i]=='['&&a[i+1]==')')
flag=-1;
}
if(l%2==1)//l&1
{
printf("No\n");
}
else if(l1!=r1||l2!=r2)
{
printf("No\n");
}
else if(flag==-1)
{
printf("No\n");
}
else printf("Yes\n");
}
return 0;
}
栈的代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<stack>
using namespace std;
int main()
{
int n;
cin>>n;
getchar();
while(n--){
stack<char> ss;
char a;
int flag=1;
while (cin.get(a) && a != '\n')
{
if(a==')')
{
if(ss.empty())
flag=0;
else if(ss.top()=='(')
ss.pop();
else flag=0;
}
else if(a==']')
{
if(ss.empty())
flag=0;
else if(ss.top()=='[')
ss.pop();
else flag=0;
}
else ss.push(a);
// if(flag==0)break;
}
if(flag&&ss.empty())
{
printf("Yes\n");
}
else printf("No\n");
}
return 0;
}
总结:
1、这道题感觉和回文的有点类似,以后再见到这样的找匹配的题目是应考虑一下栈。
2、对字符串操作时不一定是一次性读入更好,有时更需要一个字符一个字符的读
3、注意题干中给的信息,这道题因为空串错了好几遍