【问题标题】:Checking if an expression is balanced in terms of parantheses检查表达式是否根据括号平衡
【发布时间】:2013-12-05 09:49:37
【问题描述】:

我正在尝试检查表达式在括号方面是否平衡,我的程序应输出适当的消息,如下所示:(我正在从文件中读取表达式)

如果每个“)”都有一个“(”,那么它是平衡的。 如果有 ")" 而没有 "(" 则左括号丢失,依此类推。

我为“(A+B)”的情况编写了代码,它打印平衡,但对于“(A+B))”的情况,它打印平衡和遗漏,我似乎不能找出问题所在

代码如下: (编辑:我把它作为一种方法来解决,当表达式平衡并且右括号丢失时它工作正常,但如果左括号丢失,它会打印出“平衡”)问题是当它缺少左括号时括号,返回的堆栈是空的,所以这就是它打印 "balanced" 的原因。我真的不知道如何解决这个问题!

 public static Stack isBalanced(String str) {

    Stack s = new Stack();
    char temp;

    for (int i = 0; i < str.length(); i++) {
        if (str.charAt(i) == '(') {
            s.push(str.charAt(i));
        } else if (str.charAt(i) == ')') {
                if (!s.isEmpty()) {
                temp = (char) s.pop();
            }
        }
    }
    return s;
}

【问题讨论】:

  • 用调试器单步执行这个告诉你什么?
  • @RossDrew - 请考虑取消删除您的答案。当然,它并不完美,但应该很容易修复。
  • 调试器是你的朋友,但是......你会看到你会重复检查它的特性。第一个“)”将打印“balanced”,第二个将打印“left missing”。在最后做这个检查。在循环中,您只需要计算它们(+1 表示“(”,-1 表示“)”)。 此计数的结果必须为零,并且在循环期间它不能为
  • @DavidWallace 我的扳机手指太快了。它甚至没有回答问题,就被chrylis击中了它的头。
  • @DavidWallace 在调试过程中发现,当 st=")" 我弹出该值并检查堆栈是否为空两次......所以导致打印“平衡”然后“遗漏”所以我正在努力解决这个问题并再次检查我的代码

标签: java nested stack


【解决方案1】:

这似乎是解决问题的一种过于复杂的方法。您只需意识到在这种情况下您只匹配一对可能的配对,因此简单的计数就足够了。

只需扫描字符串检查每个字符。每次递增一个计数器(,每次递减)。

如果计数器低于零,那么你有一个额外的右括号。如果您完成扫描并且计数器不为零,那么您有一个额外的左括号。

【讨论】:

  • +1 OP 使用的堆栈本身只是一个一元计数器。它通过堆栈中(s 的计数来表示一个整数。
  • @SubirKumarSao 我想我知道为什么投了反对票:反对者认为蒂姆的答案与罗斯删除的答案相同。无论如何,反对票已经被删除了。
  • 这个比较简单,但我不推荐它,因为这看起来像是一个介绍性的 PDA 作业,以后要建立。
【解决方案2】:

您每次遇到) 时都会检查堆栈isEmpty,并在您的计数第一次降至零时打印“Balanced”。您应该只在最后进行检查(并且您还需要确保您从未在整个过程中看到堆栈不足)。

【讨论】:

  • 您所说的“整个堆栈欠载”是什么意思?并且通过您的回答,您指出我应该检查“)”作为最后一次检查?
  • @P.성미 我的意思是,如果你得到一个没有匹配打开的右括号,你应该立即将表达式标记为错误(设置一个布尔标志,break,return,不管)。
【解决方案3】:

我已经解决了这个问题,最后我只有一个条件是检查堆栈是否为空,并且我没有在堆栈不为空时设置条件,所以如果堆栈恰好是空我会将右括号推入其中,并在主中打印适当的消息(我忘了在上面的代码中添加我的 mm)

        if (!s.isEmpty()) {
           temp = (char) s.pop();
        }else{
         s.push(str.charAt(i));
    }

然后在 mm 我检查我返回的堆栈是否为空并打印正确的消息(平衡-左丢失-右丢失)

【讨论】:

    猜你喜欢
    • 2020-10-14
    • 2022-08-13
    • 2019-11-01
    • 2019-07-14
    • 1970-01-01
    • 2015-11-04
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多