题目看起来并不难,第一想法就是使用栈来解决问题,左括号入栈,右括号出栈,遇到非括号就返回false,最后根据栈中是否还有元素,来确定括号组,是否合法。
于是兴致勃勃写了如下代码:
import java.util.*;
//对于一个字符串,设计一个算法,计算其是否是一个合法的字符串。
public class Parenthesis {
public boolean chkParenthesis(String A, int n) {
Stack<Character> s = new Stack<>();
char[] c = A.toCharArray();//toCharArray()方法真的很常用!!!
for (int i = 0; i < n; i++) {
if(c[i] == '('){
s.push('(');
}else if(c[i] == ')'){
s.pop();
}else{
return false;
}
}
if(s.size() != 0){
return false;
}else{
return true;
}
}
public static void main (String[] args){
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
int n = s.length();
System.out.println(new Parenthesis().chkParenthesis(s,n));
}
}
但是!怎么怎么都跑不过去,纠结了好久,怎么看自己的代码怎么对。最终重要发现重要问题,在栈中删除元素时,竟然没有判断栈是否非空!!!
稍加修改,果然对了。
import java.util.*;
//对于一个字符串,设计一个算法,计算其是否是一个合法的字符串。
public class Parenthesis {
public boolean chkParenthesis(String A, int n) {
Stack<Character> s = new Stack<>();
char[] c = A.toCharArray();
for (int i = 0; i < n; i++) {
if(c[i] == '('){
s.push('(');
}else if(c[i] == ')'){
//一定要考虑栈空啊!!!
if(s.size() == 0){
return false;
}else{
s.pop();
}
}else{
return false;
}
}
if(s.size() != 0){
return false;
}else{
return true;
}
}
public static void main (String[] args){
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
int n = s.length();
System.out.println(new Parenthesis().chkParenthesis(s,n));
}
}