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

后进者先出,先进者后出,这就是典型的“栈”结构。

从栈的操作特性上来看,栈是一种“操作受限”的线性表,只允许在一端插入和删除数据。
与数组和链表来比,这两者暴露了太多的操作接口,操作上的确灵活自由,但是使用时就比较比可控,自然也就更容易出错。

复杂度分析

不管是顺序栈还是链式栈,入栈、出栈只涉及栈顶个别数据的操作,所以时间复杂度都是 O(1)。

但是如果扩容的时候就稍微的复杂一些
只分析入站操作,这 K 次入栈操作,总共涉及了 K 个数据的搬移,以及 K 次 simple-push 操作。将 K 个数据搬移均摊到 K 次入栈操作,那每个入栈操作只需要一个数据搬移和一个 simple-push 操作。以此类推,入栈操作的均摊时间复杂度就为 O(1)。

通过这个例子的实战分析,均摊时间复杂度一般都等于最好情况时间复杂度。因为在大部分情况下,入栈操作的时间复杂度 O 都是 O(1),只有在个别时刻才会退化为 O(n),所以把耗时多的入栈操作的时间均摊到其他入栈操作上,平均情况下的耗时就接近 O(1)。

典型的场景

函数调用栈
浏览器快进后退
在表达式求值应用(编译器进行四则运算,2个栈来实现,一个保存操作数,一个保存运算符)
括号匹配

你可能感兴趣的:(栈:如何实现浏览器的前进和后退功能)