【发布时间】:2017-03-07 23:10:34
【问题描述】:
这是检查字符串中包含的括号/分隔符是否平衡的简单代码 - 任何人都可以帮助解释为什么它不起作用!我确信我可以做很多事情来提高效率,但就我目前的教程而言,我想知道为什么它不能以这种形式工作以及当前的问题是什么。
首先,我不能将变量 c 添加到 LinkedList,我必须使用字面值 - 我在另一个教程中有相同的,它添加变量就好了。
其次,在某些情况下,它根本不会按照 if 语句将分隔符添加到我的链表中。字符串 '(i wonder(if) the delimiters in this) [sentence] will evaluate as[balanced}' 评估为平衡,但从我的代码来看,它不应该这样做 - 请帮我把头发拉出来。
最后,我遇到了同样的错误,但偶尔不是每个字符串都出现 - 有些是我随机输入的,例如 'csadlkfsd kljf[]{}[ ][ ]{ '
这返回了错误
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.lang.String.charAt(Unknown Source)
at set07102.Delimiter.main(Delimiter.java:16)
第 16 行是 'char c = s.charAt(0);'据我所知,这不应该发生。
System.out.println(strStack);只有最后才能检查 LinkedList - 如果它在代码中走得那么远!
任何帮助都会非常感谢大家。
import java.util.LinkedList;
import java.util.Scanner;
public class Delimiter {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
System.out.println("Please enter a string containing different types of brackets: ");
String str = scanner.nextLine();
String[] strSplit = str.split(" ");
LinkedList<Character> strStack = new LinkedList<>();
System.out.println(" ");
for(String s : strSplit) {
char c = s.charAt(0);
if(c == '('){
strStack.push('(');
}
if( c == '{'){
strStack.push('{');
}
if(c == '['){
strStack.push('[');
}
if(c == '<'){
strStack.push('<');
}
if(c == ')' && strStack.get(0) != '('){
System.out.println("The delimiters in the string " + "'" + str + "'" + " are not balanced!");
break;
}
if(c == ']' && strStack.get(0) != '['){
System.out.println("The delimiters in the string " + "'" + str + "'" + " are not balanced!");
break;
}
if(c == '}' && strStack.get(0) != '{'){
System.out.println("The delimiters in the string " + "'" + str + "'" + " are not balanced!");
break;
}
if(c == '>' && strStack.get(0) != '<'){
System.out.println("The delimiters in the string " + "'" + str + "'" + " are not balanced!");
break;
}
}
System.out.println("The delimiters in the string " + "'" + str + "'" + " are balanced. ");
System.out.println(" ");
System.out.println(strStack);
}
}
【问题讨论】:
-
我还没有添加代码来检查左右分隔符的数量是否相同,但是一旦我弄清楚存在的问题,我就可以很容易地做到这一点。再次感谢
-
你要拆分是为了什么?您正在迭代输入中的单词,我认为您应该迭代字符?
-
char c = s.charAt(0);行出现StringIndexOutOfBoundsException,表示字符串中没有索引0,即字符串为空。 -
顺便说一句,在生产代码中不会使用
LinkedList作为堆栈。请改用ArrayDeque。 -
str.split是你的第一个问题,就像 Ole V.V.指出。第二个问题是您永远不会从strStack中删除任何内容;因为它的第一个元素总是遇到的最后一个开始字符,嵌套对将不会正确匹配。
标签: java arraylist linked-list