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

如何从Java中的堆栈接收前一行文本

如何从Java中的堆栈接收前一行文本

慕田峪4524236 2022-07-27 21:59:42
我目前正在努力编写代码。问题主要发生在阵列并试图返回。该文件只需要一个 main 方法,该方法在用户输入“退出”之前执行以下操作:• 提示用户访问、返回(仅在可能时)或退出的 URL• 访问并显示输入的 URL• 返回并显示之前访问过的 URL(如果可能)• 如果用户在没有要返回的页面时输入“返回”,则应显示适当的消息。这是一个输出示例:输入 URL 或“退出”:返回没有可返回的网址输入 URL 或“退出”:http ://www.wwe.com当前网址:http ://www.wwe.com输入 URL 或“退出”:返回没有可返回的网址当前网址:http ://www.wwe.com输入 URL 或“退出”:http ://www.amazon.com当前网址:http ://www.amazon.com输入网址、“返回”或“退出”:http ://www.google.com当前网址:http ://www.google.com输入 URL、“返回”或“退出”:返回当前网址:http ://www.amazon.com输入 URL、“返回”或“退出”:返回当前网址:http ://www.wwe.com输入 URL 或“退出”:quit这是我当前的代码:public class BrowsingHistory{ public static void main(String [] args) {    Scanner url = new Scanner(System.in);    String web = "";    String currentURL = "";    Stack<String> myStack = new Stack<>();    System.out.print("Enter a URL or \"quit\": ");    web = url.nextLine();    while (!web.contains("quit"))    {        System.out.println();        System.out.print("Enter a URL, \"back\", or \"quit\": ");        web = url.nextLine();        if(web.equals("back") && myStack.isEmpty())        {            System.out.println("No URL to go back to");        }            else if(!web.equals("back"))            {                myStack.push(web);                System.out.println("Current URL: " + myStack.peek());            }            else                {                    System.out.println("No URL to go back to");                    System.out.println("Current URL: " + myStack.pop());        }        }}}以下是它需要通过的测试,以便澄清: @Test void testMain() {     setInput("back\nhttp://www.uwec.edu\nback\nhttp://www.amazon.com\nhttp://.    w.google.com\nback\nback\nquit\n");BrowsingHistory.main(null); String mainOutput = outContent.toString();  Scanner driverOut = new Scanner(mainOutput);     String outputLine = getNextOutputLine(driverOut);    assertEquals("Enter a URL or \"quit\":", outputLine.substring(0, outputLine.indexOf(":")+1).trim(), "BrowsingHistory doesn't run as expected (initial prompt problem)");
查看完整描述

3 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

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


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


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


使用 pop() 返回。


编辑 - 支持前锋


如果您还想支持“转发”命令,您可以使用第二个堆栈并将您从历史堆栈中弹出的 url 推送到该转发堆栈上。当输入 'forward' 命令时,检查 forward-stack 是否为空,如果不是,则从那里弹出 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-07-27
?
手掌心

TA贡献1942条经验 获得超3个赞

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


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-07-27
?
holdtom

TA贡献1805条经验 获得超10个赞

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


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-07-27
  • 3 回答
  • 0 关注
  • 109 浏览

添加回答

举报

0/150
提交
取消
微信客服

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

帮助反馈 APP下载

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

公众号

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