用双栈实现 Web 导航

一 问题描述

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

Web 导航支持下面的命令。

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

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

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

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

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

输入样例

输出样例

VISIT AAAAAAAAAA

AAAAAAAAAA

VISIT BBBBBBBBBBB

BBBBBBBBBBB

BACK

AAAAAAAAAA

BACK

 XXXXXXXXXXXX

BACK

Ignored

FORWARD

AAAAAAAAAA

VISIT CCCCCCCCC

CCCCCCCCC

BACK

AAAAAAAAAA

BACK

 XXXXXXXXXXXX

FORWARD

AAAAAAAAAA

FORWARD

CCCCCCCCC

FORWARD

Ignored

QUIT

二 算法设计

模拟 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;
            }
        }
    }
}

五 测试

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值