用双栈实现 Web 导航

x33g5p2x  于2022-03-05 转载在 其他  
字(3.2k)|赞(0)|评价(0)|浏览(200)

一 问题描述

标准的 Web 浏览器包含在最近访问过的页面中向后和向前移动的功能。实现这些特性的一种方法是使用双栈来跟踪前后移动可以到达的页面。

Web 导航支持下面的命令。

  • 后退页面:将当前页面推到前进栈的顶部。从后退栈的顶部弹出页面,使其成为新的当前页面。如果后退栈为空,则忽略该命令。
  • 前进页面:将当前页面推到后退栈的顶部。从前进栈顶部弹出页面,使其成为新的当前页面。如果前进栈为空,则忽略该命令。
  • 访问页面:将当前页面推到后向栈的顶部,使 URL 成为新的当前页面。前进栈清空。
  • 退出页面:退出浏览器

下面红色表示的分别对应上面列出的四个功能。

输入:输入一系列的后退、前进、访问、退出命令进行测试。

输出:对于除退出外的命令,则在执行该命令后单行输出当前页的 URL,否则输出 Ignored。退出命令没有输出。

假设浏览器的最初页面 URL 为 XXXXXXXXXXXX

| <br>输入样例<br> | <br>输出样例<br> |
| <br>VISIT AAAAAAAAAA<br> | <br>AAAAAAAAAA<br> |
| VISIT BBBBBBBBBBB | <br>BBBBBBBBBBB<br> |
| <br>BACK<br> | <br>AAAAAAAAAA<br> |
| <br>BACK<br> | <br>XXXXXXXXXXXX<br> |
| <br>BACK<br> | <br>Ignored<br> |
| <br>FORWARD<br> | <br>AAAAAAAAAA<br> |
| <br>VISIT CCCCCCCCC<br> | <br>CCCCCCCCC<br> |
| <br>BACK<br> | <br>AAAAAAAAAA<br> |
| <br>BACK<br> | <br>XXXXXXXXXXXX<br> |
| <br>FORWARD<br> | <br>AAAAAAAAAA<br> |
| <br>FORWARD<br> | <br>CCCCCCCCC<br> |
| <br>FORWARD<br> | <br>Ignored<br> |
| <br>QUIT<br> | <br> |

二 算法设计

模拟 web 浏览器的前进和后退两个操作,可以使用两个栈来解决。backward 表示后退栈,forward 表示前进栈。

1 初始时,当前页 cur 为 XXXXXXXXXXXX。

2 BACK:如果后退栈为空,则忽略该命令;否则将当前页放入到前进栈,从后退栈的顶部弹出页面,使其成为新的当前页面。输出当前页面。

3 FORWARD:如果前进栈为空,则忽略该命令;否则将当前页放入到后退栈,从前进栈的顶部弹出页面,使其成为新的当前页面。输出当前页面。

4 VISIT:将当前页面放入后退栈的顶部,并使 URL 成为新的当前页面。前进栈清空。输出当前页面。

5 QUIT:退出浏览器

三 图解

1 初始时,cur 为 XXXXXXXXXXXX

2 VISIT AAAAAAAAAA,将当前页面放入到后退栈的顶部,并使 URL 成为新的当前页面。前向栈清空。输出 AAAAAAAAAA。

3 VISIT BBBBBBBBBBB,将当前页面放入到后退栈的顶部,并使 URL 成为新的当前页面。前向栈清空。输出 BBBBBBBBBBB。

4 BACK:如果后退栈为空,则忽略该命令;否则将当前页放入到前进栈,从后退栈的顶部弹出页面,使其成为新的当前页面。输出当前页面。输出 AAAAAAAAAA

5 BACK:如果后退栈为空,则忽略该命令;否则将当前页放入到前进栈,从后退栈的顶部弹出页面,使其成为新的当前页面。输出当前页面。输出 XXXXXXXXXXXX

6 BACK:后退栈为空,输出忽略该命令。输出:ignored。

7 FORWARD:如果前进栈为空,则忽略该命令;否则将当前页放入到后退栈,从前进栈的顶部弹出页面,使其成为新的当前页面。输出当前页面。输出 AAAAAAAAAA。

8 VISIT CCCCCCCCC:将当前页面放入到后退栈的顶部,并使 URL 成为新的当前页面。前向栈清空。输出 CCCCCCCCC。

9 BACK:如果后退栈为空,则忽略该命令;否则将当前页放入到前进栈,从后退栈的顶部弹出页面,使其成为新的当前页面。输出当前页面。输出 AAAAAAAAAA。

10 BACK:如果后退栈为空,则忽略该命令;否则将当前页放入到前进栈,从后退栈的顶部弹出页面,使其成为新的当前页面。输出当前页面。输出 XXXXXXXXXXXX。

11 FORWARD:如果前进栈为空,则忽略该命令;否则将当前页放入到后退栈,从前进栈的顶部弹出页面,使其成为新的当前页面。输出当前页面。。输出 AAAAAAAAAA。

12 FORWARD:如果前进栈为空,则忽略该命令;否则将当前页放入到后退栈,从前进栈的顶部弹出页面,使其成为新的当前页面。输出当前页面。。输出 CCCCCCCCC。

13 FORWARD:前进栈为空,忽略该命令。

Ignored

14 QUIT:结束

四 实现

package concurrent;

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

public class WebStack {
    public static void main(String[] args) {
        // 后退栈
        Stack<String> backward = new Stack<>();
        // 前进栈
        Stack<String> forward = new Stack<>();
        // 当前页面
        String cur = "XXXXXXXXXXXX";

        Scanner input = new Scanner(System.in);

        while (true) {
            String readString = input.nextLine();
            if (readString.equals("VISIT")) {
                backward.push(cur);
                cur = input.nextLine();
                System.out.println(cur);
                while (!forward.empty()) {
                    forward.pop();
                }
            } else if (readString.equals("BACK")) {
                if (backward.empty()) {
                    System.out.println("Ignored");
                } else {
                    forward.push(cur);
                    cur = backward.pop();
                    System.out.println(cur);
                }
            } else if (readString.equals("FORWARD")) {
                if (forward.empty()) {
                    System.out.println("Ignored");
                } else {
                    backward.push(cur);
                    cur = forward.pop();
                    System.out.println(cur);
                }
            } else {
                System.out.println("exit");
                return;
            }
        }
    }
}

五 测试

下面测试结果中,绿色为输入,白色为输出。

相关文章