zoukankan      html  css  js  c++  java
  • 【数据结构与算法之美】3.基于栈实现的浏览器前进和后退功能

    package com.ncst.stack;
    
    import java.util.List;
    
    /**
     * @author i
     * @create 2019/12/19 21:34
     * @Description
     *  使用前后栈实现浏览器的前进后退
     *
     *  思路:创建两个栈空间 一个用来存储前后的页面goBackStack,一个用来记录后退的页面goForwardStack。一个属性记录当前页currentPage;
     *      1.第一种情况 用户第一次点击baidu.com 这个时候只需要直接显示用户查看的页面。
     *          1.1.用户在原有基础上点击了souhu.com  这个时候 需要用goBackStack记录用户之前点击的baidu.com
     *          1.2.用户回退 查看当前goBackStack栈是否为空 不为空 可以回退原页面。否则报错。
     *              回退的时候,需要将当前的页面 保存在goForwardStack
     *          1.3 当用户每点击一次新的页面,goForwarsStack栈都需要清除掉之前保存的数据。
     */
    public class SimpleBrowser {
    
        private LinkedListBasedStack goBackStack;//回退栈
        private LinkedListBasedStack goForwardStack;//前进栈
        private String currentPage;//当前页
    
        //初始化
        public SimpleBrowser(){
            goBackStack = new LinkedListBasedStack();
            goForwardStack = new LinkedListBasedStack();
        }
    
        //openBrowser
        public void open(String url){
            if (currentPage!=null){
                //如果在原有页面打开 需要保存当前页面
                goBackStack.push(this.currentPage);
                //用户每点击一个新页面 都需要清理掉之前保存的页面
                goForwardStack.clear();
            }
            openUrl(url,"open");
        }
    
        private void openUrl(String url,String fix){
            System.out.println(fix+" == currentPage => "+ url);
            this.currentPage = url;
        }
    
        //后退
        public String goBack(){
            if (isCanBack()){
                //回退操作 需要保存当前页面保存到goForwardStack栈中
                goForwardStack.push(this.currentPage);
                String backPage = goBackStack.pop();
                openUrl(backPage,"---goBack---");
                return backPage;
            }
            System.out.println("goBackStack is empty!");
            return null;
        }
    
        //前进
        public String goForward(){
            if (isCanForward()){
                //前进操作需要将当前页面添加到goBackStack栈中
                goBackStack.push(this.currentPage);
                String forwardPage = goForwardStack.pop();
                openUrl(forwardPage,"---goForward---");
                return forwardPage;
            }
            System.out.println("goForwardStack is empty!");
            return null;
        }
    
        //isCanBack
        private boolean isCanBack(){
            return this.goBackStack.size>0;
        }
    
        //isForward
        private boolean isCanForward(){
            return this.goForwardStack.size>0;
        }
    
    
        public static void main(String[] args) {
            SimpleBrowser browser = new SimpleBrowser();
            browser.open("www.baidu.com");
            browser.open("www.baidu.com/news");
            browser.open("www.baidu.com/pan");
    
            browser.goBack();
    //        browser.goBack();
    
            browser.goForward();
    
        }
    
    
        private static class LinkedListBasedStack{
    
            private Integer size = 0;
            private Node top;
    
            //创建一个结点
            public Node createNode(String value,Node next){
                return new Node(value,next);
            }
    
            //入栈操作
            public void push(String data){
                if (top==null){
                    top = createNode(data,null);
                    size++;
                    return;
                }
    
                Node cur = createNode(data,top);
                top = cur;
                size++;
            }
    
            //出栈操作
            public String pop(){
                if (top==null){
                    throw new NullPointerException("stack is empty!");
                }
                String value = top.data;
                top = top.next;
                size--;
                return value;
            }
    
            //遍历
            public void printfAll(){
                Node cur = this.top;
                if (cur == null){
                    return;
                }
    
                while (cur!=null){
                    System.out.print(cur.data+",");
                    cur = cur.next;
                }
            }
    
            //当出现回退到a页面时 直接点击了d页面 就无法回退到a页面之后页面 这个时候就需要将栈中的数据直接清除
            public void clear(){
                size = 0;
                top = null;
            }
    
            //获取栈顶数据
            public String getTop(){
                Node cur = this.top;
                if (cur==null){
                    return null;
                }
                return cur.data;
            }
    
            public int size(){
                return size;
            }
    
            public static void main(String[] args) {
                LinkedListBasedStack stack = new LinkedListBasedStack();
                stack.push("1");
                stack.push("2");
                stack.push("3");
    
                stack.printfAll();
                System.out.println("-----------");
                System.out.println(stack.pop());
                System.out.println(stack.pop());
                System.out.println(stack.pop());
    
            }
    
        }
    
        private static class Node{
            private String data;//数据
            private Node next;
    
            public Node(String data){
                this(data,null);
            }
    
            public Node(String data, Node next) {
                this.data = data;
                this.next = next;
            }
    
            public String getData() {
                return data;
            }
    
            public void setData(String data) {
                this.data = data;
            }
    
            public Node getNext() {
                return next;
            }
    
            public void setNext(Node next) {
                this.next = next;
            }
        }
    
    
    }
    
  • 相关阅读:
    阿里巴巴开源的Asynchronous I/O Design and Implementation
    maven 出现错误 -source 1.5 中不支持 diamond 运算符
    Kafka设计解析(六)- Kafka高性能架构之道
    Kafka设计解析(七)- Kafka Stream
    flink如何动态支持依赖jar包提交
    Hbase技术笔记
    windows环境:idea或者eclipse指定用户名操作hadoop集群
    HBase源码实战:BufferedMutator
    HBase工具:如何查看HBase的HFile
    HBase源码实战:CreateRandomStoreFile
  • 原文地址:https://www.cnblogs.com/qxlxi/p/12860748.html
Copyright © 2011-2022 走看看