描述:
现在,有一行括号序列,请你检查这行括号是否配对。
输入:
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出:
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入:
3
[(])
(])
([[]()])
样例输出:
No
No
Yes
代码实现:
package com.du.acm1;
import java.util.Scanner;
import java.util.Stack;
public class Matching {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Integer count = sc.nextInt();
String[] str = new String[count];
for(int i =0 ;i<count;i++){
str[i] = sc.next();
}
for(int i = 0;i<count;i++){
if(check(str[i])){
System.out.println("Yes");
}else{
System.out.println("No");
}
}
}
public static boolean check(String str){
//定义一个boolean值的变量用来存储check方法的返回值
boolean bo = false;
//new一个堆栈用来存放str的的值,将str的使用charAt()方法放入到堆栈中
Stack<Character> stack = new Stack<Character>();
//首先得到传来的字符串的长度
Integer len = str.length();
//对字符串进行循环
for(int i = 0;i<len;i++){
//第一次的时候堆栈为空,将str字符串的第一个字符放进堆栈中
if(stack.isEmpty()){
stack.push(str.charAt(i));
//在后来的比较中,用栈顶的元素和str的第一个元素进行比较,也就是堆栈中的元素和他相邻的元素进行比较
}else if((stack.peek() == '[' && str.charAt(i) == ']')||(stack.peek() == '(' && str.charAt(i)== ')')){
stack.pop();
//当不满足第二个条件的时候继续压栈
}else{
stack.push(str.charAt(i));
}
}
//当栈内元素为空的时候表示全部匹配,返回true
if(stack.isEmpty()){
bo = true;
}else{
bo = false;
}
return bo;
}
}