为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Java 中从堆栈接收上一行文本

如何在 Java 中从堆栈接收上一行文本

拉丁的传说 2022-08-03 10:28:44
我目前正在为代码而苦苦挣扎。问题主要发生在阵列和尝试回访时。此文件只需要一个 main 方法,该方法执行以下操作,直到用户输入“quit”:• 提示用户输入要访问、返回(仅在可能的情况下)或退出的 URL•访问并显示输入的URL•返回并显示以前访问过的URL(如果可能)• 如果用户在没有要返回的页面时输入“后退”,则应显示相应的消息。下面是一个输出示例:输入网址或“退出”:返回没有要返回的网址输入网址或“退出”:http://www.wwe.com当前网址:http://www.wwe.com输入网址或“退出”:返回没有要返回的网址当前网址:http://www.wwe.com输入网址或“退出”:http://www.amazon.com当前网址:http://www.amazon.com输入网址“后退”或“退出”:http://www.google.com当前网址:http://www.google.com输入网址“后退”或“退出”:后退当前网址:http://www.amazon.com输入网址“后退”或“退出”:后退当前网址:http://www.wwe.com输入网址或“退出”:退出
查看完整描述

3 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

使用 Stack 类而不是 ArrayList 会让你的生活更轻松。


使用 push() 将新的 url 添加到堆栈。


使用 empty() 检查是否可以返回。


使用 pop() 返回。


编辑 - 支持转发


如果您还想支持“转发”comand,则可以使用第二个堆栈,并将从该转发堆栈上的历史堆栈中弹出的URL推送。输入“forward”命令时,检查正向堆栈是否为空,如果没有,请从那里弹出 url 并将其推送回历史记录堆栈。


编辑 2 - 示例代码


以下是一些基本代码来解释 2 堆栈解决方案:


Stack<String> historyStack = new Stack<>();

Stack<String> forwardStack = new Stack<>();

String currentUrl = null;


boolean running = true;

while(running) {

    String input = getUserInput();

    switch(input) {

        case "quit":

            running = false;

            break;

        case "back":               

            if (!historyStack.empty()) {

                if (currentUrl != null) {

                    forwardUrl.push(currentUrl);

                }

                currentUrl = historyStack.pop();

                System.out.println(currentUrl);

            } else {

                System.out.println("nothing to go back to");

            }

            break;

        case "forward":

            if (!forwardStack.empty()) {

                if (currentUrl != null) {

                    historyStack.push(currentUrl);

                }

                currentUrl = forwardStack.pop();

                System.out.println(url);

            } else {

                System.out.println("nothing to go forward to");

            }

            break;

        default:

            if (currentUrl != null) {

                historyStack.push(currentUrl);

            }

            currentUrl = input;

            System.out.println(url);

            // entering a new url makes forward stack invalid

            forwardStack.clear();

    }

}


查看完整回答
反对 回复 2022-08-03
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

您可以将逻辑更改为如下所示:


ArrayList<String> webs = new ArrayList<String>();

String web = "";

Scanner url = new Scanner(System.in);


int count = 0;

while (!web.contains("quit")) {

    System.out.println("Enter a URL or \"quit\":");

    web = url.next();

    if (!web.equals("back")) {

        webs.add(web);

        count = webs.size();

    } else if (web.equals("back") && !webs.isEmpty()) {

        if (count > 0) {

            count--;

            System.out.println(webs.get(count));

        } else {

            System.out.println("No url to go back to");

        }

    }

}

请注意以下几点:

  1. 我们只添加不等于 back 的字符串

  2. 在之前的实现中,输入的第一个 URL 未插入到列表中。

  3. 将元素添加到列表后,计数将重置为列表的大小。


正如其他人所指出的那样,通过使用堆栈可以更容易地实现相同的目标

Scanner url = new Scanner(System.in);

String web = "";

Stack<String> myStack = new Stack<>();

while (!web.contains("quit")) {

    System.out.println("Enter a URL or \"quit\":");

    web = url.next();

    if (!web.equals("back") && !web.equals("quit")) {

        myStack.push(web);

    } else {

        if (!myStack.isEmpty()) {

            System.out.println(myStack.pop());

        } else {

            System.out.println("No url to go back to");

        }

    }

}


查看完整回答
反对 回复 2022-08-03
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

您使用了不正确的数据结构。 是可以的,但在这里使用更正确:你添加到末尾并从末尾检索,这个id LIFO。ListStack


private static final String QUIT = "quit";

private static final String BACK = "back";


try (Scanner url = new Scanner(System.in)) {

    Deque<String> stack = new LinkedList<>();


    while (true) {

        System.out.print("Enter a URL, \"" + BACK + "\" or \"" + QUIT + "\": ");

        String str = url.next();


        if (str.equalsIgnoreCase(QUIT))

            break;

        else if (str.equalsIgnoreCase(BACK)) {

            if (!stack.isEmpty())

                stack.pop();

            System.out.println(stack.isEmpty() ? "No URL to go back to" : stack.element());

        } else

            stack.push(str);

    }

}

演示


Enter a URL, "back" or "QUIT": http://www.wwe.com

Enter a URL, "back" or "QUIT": http://www.amazon.com

Enter a URL, "back" or "QUIT": http://www.google.com

Enter a URL, "back" or "QUIT": back

http://www.amazon.com

Enter a URL, "back" or "QUIT": back

http://www.wwe.com

Enter a URL, "back" or "QUIT": back

No URL to go back to

Enter a URL, "back" or "QUIT": quit


查看完整回答
反对 回复 2022-08-03
  • 3 回答
  • 0 关注
  • 192 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号