您的位置:首页 > 其它

ACM-括号配对问题

2016-08-03 00:43 417 查看

题目


括号配对问题
时间限制:3000 ms  |  内存限制:65535 KB
难度:3

描述
现在,有一行括号序列,请你检查这行括号是否配对。

输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([[]()])


样例输出

No
No
Yes


思考
本以为题目很简单,仔细思考后发现,其实很难。
1.最开始认为,括号的左右是对称,一一配对的。如" [ ( ) ] " 。其实不是。
也就是说,左右括号配对次序不对称。如题目的第三个输入一样。
2.题目的第一个输入也要特别注意,它也是不配对的。如," [ ( ] ) "。
3.所以分析了一下,共有四种可能性:
①左右括号配对次序不正确

②右括号多于左括号

③左括号多于右括号

④左右括号匹配正确

(注:引自http://blog.csdn.net/niushuai666/article/details/6632614)

代码

#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<cstdio>
using namespace std;

struct sStack
{
char sign[10010];
int top;
};

//栈初始化
void initstack(sStack &s)
{
s.top = -1;
}

//判断栈为空
bool isemptystack(sStack &s)
{
return s.top == -1 ? 1 : 0;
}

//元素进栈
int pushstack(sStack &s, char c)
{
int i = (++s.top);
//cout << i << endl;
s.sign[i] = c;
//s.sign[++s.top] = c;
return 1;
}

//出栈
int popstack(sStack &s)
{
if(isemptystack(s))
return 0;
s.top--;
return 1;
}

//获得栈顶元素
char topstack(sStack &s)
{
if(isemptystack(s))
return 0;
return s.sign[s.top];
}

//
//   [(])
//   (])
//   ([[]()])
int main()
{
int N, len, i;
bool flag;
char str[10010];
sStack s;
scanf("%d", &N);
while(N--)
{
flag = 1;
scanf("%s", str);
len = strlen(str);
initstack(s);
for(i = 0; i < len; ++i)
{
if(str[i] == '(' || str[i] == '[' || str[i] == '{')
pushstack(s, str[i]);
else if(str[i] == ')')
{
if(isemptystack(s) || topstack(s) != '(')	flag = 0;
else	popstack(s);
}
else if(str[i] == ']')
{
if(isemptystack(s) || topstack(s) != '[')	flag = 0;
else	popstack(s);
}
else if(str[i] == '}')
{
if(isemptystack(s) || topstack(s) != '{')	flag = 0;
else	popstack(s);
}
}
if(!isemptystack(s)) {flag = 0;}
if(flag)	printf("Yes\n");
else	printf("No\n");
}
return 0;
}


运行
2                                                                                                                                                                         

[ [ ( ) ] ] ( )                                                                                                                                                                  
Yes                                                                                                                                                                       
[ [ [ ( ] ) ] ]                                                                                                                                                                  
No 

大神的代码

#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
vector<char> vec;
string ch;
vec.push_back(' ');
cin>>ch;
for(int i=0;i<ch.length();i++)
{
vec.push_back(ch[i]);
if( vec.back()-1 == *(vec.end()-2) || vec.back()-2 == *(vec.end()-2))
{
vec.pop_back();
vec.pop_back();
}
}
if(vec.size()==1)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm