描述 现在,有一行括号序列,请你检查这行括号是否配对。
输入格式
每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出格式
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
([[]()])
样例输出
Yes
解题思路:
这个题其实是错题,测试样例与提交时的评测数据不一致,真确表述应为:先输入一个n,表示有几行,接着依次输入n行。用栈模拟,在由于左边缺括号而不匹配时,当检查栈顶时需要判断栈是否为空,否则会栈索引越界。
也可以遇到右括号时不比较栈顶,直接出栈,最后再判断。
java代码:
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
StringBuilder builder = new StringBuilder();
for(int j = 0; j <n ;j++){
String str = br.readLine();
Stack<Character> st = new Stack<>();
boolean flag = true;
for(int i = 0; i < str.length();i++) {
char t = str.charAt(i);
if(t == '(' || t == '[') {
st.push(t);
}else {
if(t == ')') {
if((st.size() != 0 && st.peek() != '(') || st.size() == 0) {//防止越界
builder.append("No\n");
flag = false;
break;
}else {
st.pop();
}
}else if(t == ']') {
if((st.size() != 0 && st.peek() != '[') || st.size() == 0) {
builder.append("No\n");
flag = false;
break;
}else {
st.pop();
}
}
}
}
if(st.size() != 0 && flag == true) {
builder.append("No\n");
}else if(st.size() == 0 && flag == true){
builder.append("Yes\n");
}
}
System.out.print(builder.toString().trim());
}
}
提交截图:?
|