【问题标题】:Check whether the brackets and delimiters contained in a string are balanced检查字符串中包含的括号和分隔符是否平衡
【发布时间】: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


【解决方案1】:

这是一种方法。我不确定它是否完全没有错误并且可以处理所有情况,但我认为它可能很接近。

正如其他用户评论的那样,拆分输入字符串是错误的方法。您需要遍历每个字符并使用堆栈来跟踪您看到的括号以及接下来应该关闭的括号。

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.");
        }
    }
}

【讨论】:

  • 干杯伙计们,我没有必要分裂我不知道为什么它甚至在那里,但这是一个原因,我认为不将它们从堆栈中删除是另一个原因。现在让它工作正常!
猜你喜欢
  • 2018-06-23
  • 1970-01-01
  • 2015-05-16
  • 2011-11-04
  • 2013-12-28
  • 2021-09-15
  • 1970-01-01
  • 2018-06-26
  • 2016-02-03
相关资源
最近更新 更多