zoukankan      html  css  js  c++  java
  • 栈:如何实现浏览器的前进和后退功能?

    一、什么是栈?

    1. 后进先出先进后出,这就是典型的“栈”结构。
    2. 从栈的操作特性来看,是一种“操作受限”的线性表,只允许在一端进行操作,比如插入和删除数据。

    二、为什么需要栈?

    1. 栈是一种操作受限的数据结构,其操作特性用数组链表均可实现。
    2. 但是,任何数据结构都是对特定应用场景的抽象,数组和链表虽然使用起来更加灵活,但却暴露了几乎所有的操作,难免会引发错误操作的风险
    3. 所以,当某个数据集合只涉及在某一端插入和删除数据,且满足后进者先出,先进者后出的操作特性时,我们应该首选栈这种数据结构。

    三、如何实现栈?

    1. 栈既可以用数组来实现,也可以用链表来实现。用数组实现的栈,我们叫作顺序栈,用链表实现的栈,我们叫作链式栈。

    2.数组实现(自动扩容)

    • 时间复杂度分析:根据均摊复杂度的定义,可以得数组实现(自动扩容)符合大多数情况是O(1)级别复杂度,个别情况是O(n)级别复杂度,比如自动扩容时,会进行完整数据的拷贝。
    • 空间复杂度分析:在入栈和出栈的过程中,只需要一两个临时变量存储空间,所以O(1)级别。我们说空间复杂度的时候,是指除了原本的数据存储空间外,算法运行还需要额外的存储空间。
    • 摊还复杂度分析:在涉及扩容的那次入栈操作(即第N+1次入栈),需要将N个数据进行迁移,但是N+1次操作触发一次数据迁移,将N个数据迁移平摊到N+1次操作,复杂度为O(1)

    3.链表实现

    • 时间复杂度分析:压栈和弹栈的时间复杂度均为O(1)级别,因为只需更改单个节点的索引即可。
    • 空间复杂度分析:在入栈和出栈的过程中,只需要一两个临时变量存储空间,所以O(1)级别。我们说空间复杂度的时候,是指除了原本的数据存储空间外,算法运行还需要额外的存储空间

    四. 解答开篇

      通过两个栈实现浏览器得到前进后退功能。

      一个栈X,一个栈Y。

      每次跳转到新页面时将此页面压入X,并清空Y;当点击后退按钮式时,将X出栈,并压入到Y;当点击前进按钮时,将Y出栈,压入X。

      X为空时表示没有页面可以后退浏览了,当Y为空时表示没有页面可以前进浏览了。

  • 相关阅读:
    7-10 社交网络图中结点的“重要性”计算(30 point(s)) 【并查集+BFS】
    7-5 打印选课学生名单(25 point(s)) 【排序】
    7-3 堆栈模拟队列(25 point(s)) 【数据结构】
    7-5 家谱处理(30 分) 【数据结构】
    7-7 最强素数(100 分) 【前缀和】
    PAT 天梯赛 L2-022. 重排链表 【数据结构】
    7-1 列出叶结点(25 分) 【数据结构】
    7-6 公路村村通(30 分) 【prime】
    PAT 甲级 1116. Come on! Let's C (20) 【循环判断】
    PAT 甲级 1104. Sum of Number Segments (20) 【数学】
  • 原文地址:https://www.cnblogs.com/virgosnail/p/9843439.html
Copyright © 2011-2022 走看看