栈:如何实现浏览器的前进和后退功能?

1、什么是栈?

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

2、为何须要栈?

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

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为空时表示没有页面能够前进浏览了。数据结构

相关文章
相关标签/搜索