数据结构与算法之美——栈
Posted westcastle
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法之美——栈相关的知识,希望对你有一定的参考价值。
如何理解栈?
我们平时放盘子的时候,都是从下往上一个一个放,取的时候是从上往下一个一个取,不能从中间抽出。后进者先出,这就是典型的“栈”结构。从栈的操作特性上来看,栈是一种“操作受限”的线性表,只允许从一端插入和删除。
事实上,从功能上看,数组或链表确实可以替代栈,并且操作上更加灵活,但是,在使用时就比较不可控,更容易出错。
当一个数据集合只涉及在一端的插入和删除操作,并且满足后进先出的特性,应该首选“栈”这种数据结构。
实现一个栈
栈主要包含两个操作:出栈和入栈。栈既可以用数组来实现(顺序栈),也可以用链表来实现(链式栈)。不管是顺序栈还是链式栈,入栈和出栈的过程中,空间复杂度都是O(1),时间复杂度都是O(1)。
支持动态扩容的顺序栈
当数组的空间不够时,我们就重新申请一块更大的内存,将原来数组中的数据拷贝进去,这样就实现了一个支持动态扩容的数组,所以,如果要实现一个支持动态扩容的顺序栈,我们只需要在底层依赖一个支持动态扩容的数组就可以。对于出栈,我们不会设计内存的重新申请和数据搬移,出栈的时间复杂度仍然是O(1),但是对于入栈操作来说,当空间不够时,就需要重新申请内训空间和进行数据搬移,所以时间复杂度就变成了O(n)。
以上是关于数据结构与算法之美——栈的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript 数据结构与算法之美 - 栈内存与堆内存 浅拷贝与深拷贝
JavaScript 数据结构与算法之美 - 冒泡排序插入排序选择排序