*问题描述:
现在,有一行括号序列,检查这行括号是否配对。
输入:第一行输入一个数N,表示有N组测试数据,N>0且N<=100。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有”[“,”]”,”(“,”)”四种字符
输出:
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出“Yes”,如果不配对则输出“No”*
示例:
输入:
4
[(]
{}
{[)]{}[
([{}])
输出:
No
Yes
No
No
Yes
解决思路:对于这一问题,可以使用栈的思想来解决,将字符串中的每个字符提取,遇到左括号‘{’、‘[’、‘(’,便将其入栈,如果遇到右括号,便将栈顶字符和其配对,如果不配对,则该字符串不满足要求,如果配对成功,便将栈顶字符弹出栈即可。
这里需要注意的几点是:
1.当字符串的长度是奇数时,可以直接判断为不匹配。(不过好像对时间影响不大,不加也可以)
2.当遇到右括号时,需要先判断是否栈为空,不然就GG了,想想整个字符串只有右括号的情况(或者左括号比右括号少)。
3.当然,还要考虑下整个字符串只有左括号的情况(或者右括号比左括号少),即匹配工作做完了,还要判断下栈是否为空(如果里面还有左括号在等着也GG啊)
OK,下面附上代码(我也是初学者啊,所以程序开销并不完美,注释都是中文的…只是解决了问题,欢迎大神指正)
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args){
Scanner input=new Scanner(System.in);
int N=input.nextInt();
input.nextLine();//清空输入
String[] p=new String[N];//用来标注每一行字符串是否匹配
String[] s=new String[N];//接收字符串
for(int i=0;i<N;i++)
s[i]=input.nextLine();
for(int i=0;i<N;i++)
if(Match(s[i]))//调用函数,判断是否匹配
p[i]="Yes";
else
p[i]="No";
for(int i=0;i<N;i++)
System.out.println(p[i]);
}
public static boolean Match(String s){
if(s.length()%2!=0)
return false;//字符串是奇数,不匹配
char[] stack=new char[s.length()];
int top=-1;
for(int i=0;i<s.length();i++){
if(s.charAt(i)=='{'||s.charAt(i)=='['||s.charAt(i)=='(')
stack[++top]=s.charAt(i);
else if(s.charAt(i)==']'){
if(top==-1||stack[top]!='[')//先判断栈是否为空再匹配,top==-1要在前
return false;
else
top--;
}
else if(s.charAt(i)==')'){
if(top==-1||stack[top]!='(')
return false;
else
top--;
}
else if(s.charAt(i)=='}'){
if(top==-1||stack[top]!='{')
return false;
else
top--;
}
}
if(top!=-1)
return false;//栈不为空
return true;
}
}