字符串匹配问题
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 16 Accepted Submission(s) : 6
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
字符串中只含有括号:()、[]、<>、{},判断输入的字符串中括号是否匹配。如果括号有相互包含的形式,从内到外必须是<>、()、[]、{},例如:输入[()],输出:YES,而输入([])、([)]都应该输出NO。
Input
输入的第一行为一个整数n,表示以下有多少个由括号组成的字符串。接下来的n行,每行都是一个由括号组成的长度不超过255的字符串。
Output
对于输入的n行,输出YES或者NO。
Sample Input
5 {}{}<><>()()[][] {{}}{{}}<<>><<>>(())(())[[]][[]] {{}}{{}}<<>><<>>(())(())[[]][[]] {<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]] ><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
Sample Output
YES YES YES YES NO
思路 :巧妙的运用数字代替那些括号 使得易于区分;
1.如果栈为空 就直接入栈 否则判断是左括号还是右括号;左括号判断是否优先级高于栈顶元素 高于则无法进行
右括号则判断和栈顶元素是否匹配
#include <iostream>
#include <stdio.h>
#include <stack>
#include <string>
using namespace std;
int main ()
{ stack <int> s;
string q;
int a[1000];
int i,len,j,t;
cin>>t;
getchar();
while(t--)
{ int flag=0;
getline(cin,q);
len=q.length();
for(i=0;i<len;i++)
{
if(q[i]=='<') a[i]=1;
if(q[i]=='>') a[i]=2;
if(q[i]=='(') a[i]=3;
if(q[i]==')') a[i]=4;
if(q[i]=='[') a[i]=5;
if(q[i]==']') a[i]=6;
if(q[i]=='{') a[i]=7;
if(q[i]=='}') a[i]=8;
}
for(i=0;i<len;i++)
{
if(!s.empty())
{
if(a[i]%2!=0)
{
if(a[i]>s.top())
{
flag=1;
break;
}
else
s.push(a[i]);
}
else
{
if(a[i]!=s.top()+1)
{
flag=1;
break;
}
s.pop();
}
}
else
s.push(a[i]);
}
if(flag==1)
printf("NO\n");
else
{
if(!s.empty())
printf("NO\n");
else
printf("YES\n");
}
while(!s.empty()) s.pop();
}
return 0;
}
#include <stdio.h>
#include <stack>
#include <string>
using namespace std;
int main ()
{ stack <int> s;
string q;
int a[1000];
int i,len,j,t;
cin>>t;
getchar();
while(t--)
{ int flag=0;
getline(cin,q);
len=q.length();
for(i=0;i<len;i++)
{
if(q[i]=='<') a[i]=1;
if(q[i]=='>') a[i]=2;
if(q[i]=='(') a[i]=3;
if(q[i]==')') a[i]=4;
if(q[i]=='[') a[i]=5;
if(q[i]==']') a[i]=6;
if(q[i]=='{') a[i]=7;
if(q[i]=='}') a[i]=8;
}
for(i=0;i<len;i++)
{
if(!s.empty())
{
if(a[i]%2!=0)
{
if(a[i]>s.top())
{
flag=1;
break;
}
else
s.push(a[i]);
}
else
{
if(a[i]!=s.top()+1)
{
flag=1;
break;
}
s.pop();
}
}
else
s.push(a[i]);
}
if(flag==1)
printf("NO\n");
else
{
if(!s.empty())
printf("NO\n");
else
printf("YES\n");
}
while(!s.empty()) s.pop();
}
return 0;
}