这里是一个简单的代码来检查括号/分隔符是否包含在一个字符串是平衡的-谁能帮助为什么它不能工作!我敢肯定有很多事情我可以提高效率,但为了我目前的教程的目的,我想知道为什么它不能在这种形式下工作,目前的问题是什么。
首先,我不能将变量c添加到LinkedList中,我必须使用文字值-我在另一个教程中有相同的,它添加变量很好。
其次,在某些情况下,它根本不像if语句那样向我的linkedlist添加分隔符。字符串'(我想知道(如果)分隔符在这个)[句子]将评估为[平衡}'评估为平衡,但从我的代码不应该这样做-请帮助我在这里拔我的头发。
最后,我有同样的错误,但偶尔不是每个字符串-一些我随机输入,例如'csadlkfsd kljf[]{}[][]{'
this返回错误
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);
}
}
这里有一种方法。我不确定它是否完全没有bug,可以处理所有情况,但我认为它可能接近。
正如其他用户所评论的那样,分割输入字符串是错误的方法。你需要遍历每个字符,并使用堆栈来跟踪你看到的括号和接下来应该关闭的括号。
import java.util.HashMap;
import java.util.Scanner;
import java.util.Stack;
public class BalancedBrackets
{
public static void main(String[] args)
{
HashMap<Character,Character> bracketPairs = new HashMap<Character,Character>();
bracketPairs.put('[', ']');
bracketPairs.put('(', ')');
bracketPairs.put('{', '}');
bracketPairs.put('<', '>');
Stack stack = new Stack();
Scanner scanner = new Scanner(System.in);
System.out.println("Please enter a string containing different types of brackets: ");
String str = scanner.nextLine();
for(int i = 0; i < str.length(); i++)
{
char c = str.charAt(i);
if(bracketPairs.keySet().contains(c))
{
stack.push(c);
}
if(bracketPairs.values().contains(c))
{
if(stack.size() == 0)
{
System.out.println("Unexpected closing bracket.");
return;
}
char lastOpen = (char) stack.peek();
char expectedClose = bracketPairs.get(lastOpen);
if(expectedClose == c)
{
stack.pop();
}
else
{
System.out.println("Unexpected closing bracket.");
return;
}
}
}
if(stack.size()==0)
{
System.out.println("String is balanced.");
}
else
{
System.out.println("String is unbalanced.");
}
}
}