【问题标题】:Sorting with single stack and switch arguments in java在java中使用单个堆栈和开关参数进行排序
【发布时间】:2021-10-11 20:48:35
【问题描述】:

我正在尝试编写 2 种方法,它们可以仅使用 1 个堆栈和 1 个 switch 语句对一串括号进行排序。我无法让它工作,我想知道是否可能是因为字符串中的 ' ' 的情况?默认情况下不应该选择这些还是我理解 switch 语句错误?这就是我现在的位置。

out.println(checkParentheses("({} [()] ({}))"));  // should print true 
                                                                
out.println(!checkParentheses("({} [() ({)})"));  // should print false 


Boolean checkParentheses(String brackets) {

    Deque<Character> stack = new ArrayDeque<>();


    for( char ch : brackets.toCharArray()) {
        if (stack.peek() == matching(ch)) {
            stack.pop();
        } else {
           stack.add(ch);
        }
    }
    return stack.isEmpty();
}


char matching(char ch) {
    // char c = (' ');
    switch (ch) {
        case ')':
            return '(';  // c = '('
        case ']':
            return '[';
        case '}':
            return '{';
        default:
          // return c;
          throw new IllegalArgumentException("No match found");
    }
}

【问题讨论】:

  • 您是否尝试过调试或至少运行您的代码?或者你更喜欢 SO 社区为你做这件事? if (stack.peek() == matching(ch)) 行立即抛出 NPE,因为您不检查堆栈是否为空;如果找到左括号/括号,方法 matching 将抛出 IllegalArgumentException。
  • 同样!checkParentheses("({} [() ({)})") 不能返回false,因为有逻辑NOT !operator 并且给定输入的结果肯定是false - 字符串显然不平衡,所以这里@应该是 987654328@。
  • 对不起,应该提到,但我确实运行和调试,它只是说“未找到变量”。既然你提到了它,很明显它也拒绝左括号。

标签: java switch-statement stack


【解决方案1】:
  1. 应忽略输入中的非方括号字符,可选地,可以将输入从其中清除或直接跳过
  2. 需要对开/关括号进行特殊检查。

基本上,checkParentheses 应该如下所示:

public static boolean checkParentheses(String str) {
    if (null == str || str.isEmpty()) {
        return true;
    }
    Deque<Character> stack = new ArrayDeque<>();
    
    for (char c : str.toCharArray()) {
        if (openingBracket(c)) {
            stack.push(c);
        } else if (closingBracket(c)) {
            if (stack.isEmpty() || matchingBracket(c) != stack.pop()) {
                return false;
            }
        } // else ignore non-bracket char quietly
    }
    return stack.isEmpty();
}

那么使用switch 语句的附加方法可能如下所示:

static boolean openingBracket(char c) {
    switch (c) {
        case '(': case '[': case '{': case '<':
            return true;
        default:
            return false;
    }
}

static boolean closingBracket(char c) {
    switch (c) {
        case ')': case ']': case '}': case '>':
            return true;
        default:
            return false;
    }
}

static char matchingBracket(char c) {
    switch (c) {
        case ')': return '(';
        case ']': return '[';
        case '}': return '{';
        case '>': return '<';
        default:
            throw new IllegalArgumentException("Bad character found instead of closing bracket: " + c);
    }
}

那么测试的输出如下:

System.out.println(checkParentheses("({} [()] ({}))"));  // true, balance ok
                                                                
System.out.println(!checkParentheses("({} [() ({)})"));  // true, NOT balanced 

【讨论】:

  • 谢谢!这看起来更彻底。无论如何都没有以某种方式将openbracket实现为matchingbracket吗?例如让 default 代表所有开括号?当然也必须处理 " " 在 expr = "({ })" 的情况下,这可能在 switch 语句中是不可能的,我以前从未与他们合作过,所以正在努力学习。
  • 方法 openingBracketmatchingBracket 有不同的用途和返回类型。需要openingBracket 来定义当前字符是否应该被压入堆栈。
猜你喜欢
  • 2016-03-19
  • 2015-01-14
  • 1970-01-01
  • 2021-09-03
  • 2013-06-19
  • 2021-11-02
  • 2013-05-13
  • 2011-06-17
  • 1970-01-01
相关资源
最近更新 更多