【问题标题】:Bracket checker括号检查器
【发布时间】:2020-08-04 00:33:18
【问题描述】:

所以这段代码应该接受用户输入并查看括号是否平衡。指令只是说使用while循环输入多行并打印“退出程序”。我的问题:我不确定如何在几行输入后跳出 while 循环,以便调用 sout("Exit program") - 其他一切正常。 PS。对此还是很陌生

import java.util.Scanner;
import java.util.Stack;

public class BracketChecker {
    private Stack<Character> stack = new Stack<>();

    public boolean check(String text) {
        for (int i = 0; i < text.length(); i++){
            char c = text.charAt(i);
            if (c == '{') {
                stack.push(c);
            }

            if (c == '}'){
                if (stack.empty())
                    return false;
                stack.pop();
            }
        }

        if (stack.isEmpty()){
            return true;
        }
        else{
            return false;
        }

    }

    public static void main(String[] args) {
        System.out.println("Starting bracket checker app");
        BracketChecker checker = new BracketChecker();
        Scanner in = new Scanner(System.in);
        String temp;
        while(in.hasNextLine()) {
            temp = in.nextLine();

            if (checker.check(temp)) {
                System.out.println("Syntax correct");
            } else {
                System.out.println("Syntax error");
            }

        }

        System.out.println("Exiting checker");
    }
}

【问题讨论】:

  • 请问:这是作业吗?如果是,用户应该如何结束程序?用户输入的in.hasNextLine() 将始终返回true(我认为)。
  • 同样在check方法中,如果堆栈不为空或者除非下一次调用不能正常工作,你应该在最后清除堆栈
  • 您在tio.run 中插入的代码(对类名稍作更改)按预期工作。所以请更详细地描述你的问题。
  • @Ackdari 是的,并且没有指定程序应该如何结束
  • @Ackdari 这是一个无限循环,我想知道如何摆脱它

标签: java while-loop stack brackets


【解决方案1】:

您需要定义某种停止命令,例如stop,然后检查您是否阅读了此命令,如果是则结束程序:

while(in.hasNextLine()) {
    temp = in.nextLine();

    if ("stop".equals(temp)) {
        System.out.println("Exiting checker");
        return;
    }

    if (checker.check(temp)) {
        System.out.println("Syntax correct");
    } else {
        System.out.println("Syntax error");
    }
}

System.out.println("Error");

您还需要更改check 方法的最后一部分:

if (stack.isEmpty()){
    return true;
}
else{
    stack.clear();
    return false;
}

这样堆栈在check方法结束时总是空的。

然后输入like

{{
{}
stop

将产生以下输出

Starting bracket checker app
Syntax error
Syntax correct
Exiting checker

但由于这是一个作业,您应该与您的导师或讲师确认您应该如何结束该计划

【讨论】:

    【解决方案2】:

    你的 while 循环:

     while(in.hasNextLine()) {
            temp = in.nextLine();
    
            if (checker.check(temp)) {
                System.out.println("Syntax correct");
            } else {
                System.out.println("Syntax error");
            }
    
        }
    

    将导致无限循环,如果你愿意,你可以让用户输入一个 int 来表示他们想要输入的次数

    int amount = scanner.nextInt();
    

    以及在 for 循环中使用金额。您也可以更改零件:

    if (stack.isEmpty()){
            return true;
        }
        else{
            return false;
        }
    

    只是返回 stack.isEmpty();

    【讨论】:

    • 最后一部分不正确,如果前面的输入有更多的左括号,那么关闭下一个字符串即使正确也会报错
    猜你喜欢
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    • 2014-01-11
    相关资源
    最近更新 更多