地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=2
描述
-
输入
- 第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符 输出
- 每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No 样例输入
-
3 [(]) (]) ([[]()])
样例输出
-
No No Yes
刚开始想用链式栈来实现,后面发现实现不了,改用顺序栈实现,因为太久没有写这玩意了。后面看了下书,才发现我的链式栈写错了,我是从栈底指向栈顶,而正确的写法是从栈
顶指向栈底,这样出栈的实现就退回去,不会造成找不到之前的哪一个了。
后面实现了后,分别用集合stack 和LinkList和自己写的栈进行对比了下,各有优点和缺点。
用集合要特别注意要用泛型,前后两个都要。
例如:
Stack<Character> stack=new Stack<Character>();
char[] chArr = str.toCharArray();
stack.push(chArr[i]);//这样是没有问题的,并且当把stack.push(chArr);的时候,还会在编译时就报错。
如果写成
Stack stack=new Stack<Character>();
char[] chArr = str.toCharArray();
stack.push(chArr); //这样就有问题了,编译不会报错
String str=(String)stack.pop(); //当运行到这里的时候就会报错: java.lang.ClassCastException: [B > cannot be cast to java.lang.String---意思是无法转换因为stack.push(chArr);加进去的是字符数组,当然不能转化为其他类型,最多是Object类型。
最后附上代码:
import java.util.LinkedList;
import java.util.Scanner;
import java.util.Stack;
/*
* 括号配对问题--栈
*/
public class Parentheses {
public static void main(String[] args) {
Parentheses main = new Parentheses();
Scanner cin = new Scanner(System.in);
while (cin.hasNext()) {
int n = cin.nextInt();
for (int i = 0; i < n; i++) {
String str = cin.next();
if (main.linkListSolve(str))
System.out.println("Yes");
else
System.out.println("No");
}
}
}
//用linklist实现 107 1003
public boolean linkListSolve(String str) {
LinkedList<Character> linklist=new LinkedList<Character>();
char[] chArr = str.toCharArray();
for (int i = 0; i < chArr.length; i++) {
if (chArr[i] == '[' || chArr[i] == '(') {
linklist.push(chArr[i]);
}
else{
if(linklist.isEmpty())
return false;
switch(chArr[i]){
case ']':
if(linklist.pop()!='[')
return false;
break;
case ')':
if(linklist.pop()!='(')
return false;
break;
}
}
}
return true;
}
// 集合stack实现类 115 586
public boolean stackSolve(String str) {
Stack<Character> v=new Stack<Character>();
char[] chArr = str.toCharArray();
for (int i = 0; i < chArr.length; i++) {
if (chArr[i] == '[' || chArr[i] == '(') {
v.push(chArr[i]);
}
else{
if(v.isEmpty())
return false;
switch(chArr[i]){
case ']':
if(v.pop()!='[')
return false;
break;
case ')':
if(v.pop()!='(')
return false;
break;
}
}
}
return true;
}
// 用顺序栈实现,若用链式栈,是从栈顶指向栈底 98 1475
public boolean solve(String str) {
MyStack[] myStackArr = new MyStack[10000];
int flag = -1;
char[] chArr = str.toCharArray();
for (int i = 0; i < chArr.length; i++) {
if (chArr[i] == '[' || chArr[i] == '(') {
MyStack myStack = new MyStack(chArr[i]);
myStackArr[++flag] = myStack;
} else {
if (flag == -1) // 右边括号>左边时
return false;
// 进行对应的转化后进行匹配
switch(chArr[i]){
case ']':
if(myStackArr[flag--].charA!='[')
return false;
break;
case ')':
if(myStackArr[flag--].charA!='(')
return false;
break;
}
}
}
return true;
}
class MyStack {
char charA;
public MyStack(char charA) {
this.charA = charA;
}
public char pop() {
return charA;
}
}
}