您的位置:首页 > 其它

括号配对问题

2012-11-20 17:34 232 查看

括号配对问题

[align=center]时间限制:3000 ms | 内存限制:65535 KB[/align]
[align=center]难度:3[/align]

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

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

样例输出
No
No
Yes


/*
先导入stack库
思路为先判断第一个是左还是右,如果是右就输出No
当遇到左括号就入栈,碰见右括号就出栈
*/
#include <iostream>
#include <stack>
#include <cstring>
#include <cstdio>
using namespace std;
char target[10000];
int main()
{
int N;
scanf("%d", &N);
while(N--)
{
int ok=1;
scanf("%s", target);
stack<char> s;
int len = strlen(target);
for(int i = 0; i < len; i++)
{
if( target[i] == '[' || target[i] == '(' )
s.push(target[i]);
else if( !s.empty() && target[i] == ']' && s.top() == '[' )
s.pop();
else if( !s.empty() && target[i] == ')'&&s.top() == '(' )
s.pop();
else {ok = 0;break;}
}
(s.empty() && ok)? printf("Yes\n"):printf("No\n");
}
return 0;
}


下面是最优的算法

/*
最优算法中其实是模拟栈,以t来代替栈的头指针,x相当于栈,s是一个字符数组
*/
#include <stdio.h>
int main()
{
char s[10001],x[10001];
int t,a,c;
scanf("%d",&a);
while(a--)
{
scanf("%s",s);
t=c=0;
while(c<10000&&(x[t++]=s[c++])!='\0')
if(t>1&&(x[t-1]==']'&&x[t-2]=='['||x[t-1]==')'&&x[t-2]=='('))
t-=2;
if(t==1) printf("Yes\n");
else printf("No\n");
}
return 0;
}


同样是模拟栈但是算法的内存和时间是不一样的,

利用STL库用的内存要大一点

#include <stdio.h>
int main()
{
int z;
scanf("%d%*c",&z);
while(z--)
{
char ch,s[10000];int top=-1;
while( (ch=getchar())!='\n' )
{
if(ch==')' && top>=0 && s[top]=='(')
top--;
else if(ch==']' && top>=0 && s[top]=='[')
top--;
else
s[++top]=ch;
}
if(top==-1)puts("Yes");
else puts("No");}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: