数据结构与算法之美——栈

如何理解栈?

我们平时放盘子的时候,都是从下往上一个一个放,取的时候是从上往下一个一个取,不能从中间抽出。后进者先出,这就是典型的“栈”结构。从栈的操作特性上来看,栈是一种“操作受限”的线性表,只允许从一端插入和删除。

事实上,从功能上看,数组或链表确实可以替代栈,并且操作上更加灵活,但是,在使用时就比较不可控,更容易出错。

当一个数据集合只涉及在一端的插入和删除操作,并且满足后进先出的特性,应该首选“栈”这种数据结构。

实现一个栈

栈主要包含两个操作:出栈和入栈。栈既可以用数组来实现(顺序栈),也可以用链表来实现(链式栈)。不管是顺序栈还是链式栈,入栈和出栈的过程中,空间复杂度都是O(1),时间复杂度都是O(1)。

支持动态扩容的顺序栈

当数组的空间不够时,我们就重新申请一块更大的内存,将原来数组中的数据拷贝进去,这样就实现了一个支持动态扩容的数组,所以,如果要实现一个支持动态扩容的顺序栈,我们只需要在底层依赖一个支持动态扩容的数组就可以。对于出栈,我们不会设计内存的重新申请和数据搬移,出栈的时间复杂度仍然是O(1),但是对于入栈操作来说,当空间不够时,就需要重新申请内训空间和进行数据搬移,所以时间复杂度就变成了O(n)。

原文地址:https://www.cnblogs.com/westCastle/p/10503540.html

时间: 2024-08-01 09:17:41

数据结构与算法之美——栈的相关文章

JavaScript 数据结构与算法之美 - 栈内存与堆内存 、浅拷贝与深拷贝

前言 想写好前端,先练好内功. 栈内存与堆内存 .浅拷贝与深拷贝,可以说是前端程序员的内功,要知其然,知其所以然. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习. 栈 定义 后进者先出,先进者后出,简称 后进先出(LIFO),这就是典型的栈结构. 新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另一端就叫栈底. 在栈里,新元素都靠近栈顶,旧元素都接近栈底. 从栈的操作特性来看,是一种 操作受限的线性表,只允许在

《数据结构与算法之美》——冒泡排序、插入排序、选择排序

排序,是每一本数据结构的书都绕不开的重要部分. 排序的算法也是琳琅满目.五花八门. 每一个算法的背后都是智慧的结晶,思想精华的沉淀. 个人觉得排序算法没有绝对的孰优孰劣,用对了场景,就是最有的排序算法. 当然,撇开这些业务场景,排序算法本身有一些自己的衡量指标,比如我们经常提到的复杂度分析. 我们如何分析一个算法? 排序算法的执行效率 1.最好.最坏和平均情况的时间复杂度 2.时间复杂度的系数.常数和低阶 一般来说,在数据规模n很大的时候,可以忽略这些,但是如果我们需要排序的数据规模在几百.几千

JavaScript 数据结构与算法之美 - 冒泡排序、插入排序、选择排序

1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习. 之所以把冒泡排序.选择排序.插入排序放在一起比较,是因为它们的平均时间复杂度都为 O(n2). 请大家带着问题:为什么插入排序比冒泡排序更受欢迎 ?来阅读下文. 2. 如何分析一个排序算法 复杂度分析是整个算法学习的精髓. 时间复杂度: 一个算法执行所耗费的时间. 空间复杂度:

JavaScript 数据结构与算法之美 - 归并排序、快速排序、希尔排序、堆排序

1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习. 之所以把归并排序.快速排序.希尔排序.堆排序放在一起比较,是因为它们的平均时间复杂度都为 O(nlogn). 请大家带着问题:快排和归并用的都是分治思想,递推公式和递归代码也非常相似,那它们的区别在哪里呢 ? 来阅读下文. 2. 归并排序(Merge Sort) 思想 排序一个数

《数据结构与算法之美》 <03>数组:为什么很多编程语言中数组都从0开始编号?

提到数组,我想你肯定不陌生,甚至还会自信地说,它很简单啊. 是的,在每一种编程语言中,基本都会有数组这种数据类型.不过,它不仅仅是一种编程语言中的数据类型,还是一种最基础的数据结构.尽管数组看起来非常基础.简单,但是我估计很多人都并没有理解这个基础数据结构的精髓. 在大部分编程语言中,数组都是从 0 开始编号的,但你是否下意识地想过,为什么数组要从 0 开始编号,而不是从 1 开始呢? 从 1 开始不是更符合人类的思维习惯吗? 你可以带着这个问题来学习接下来的内容. 如何实现随机访问? 什么是数

数据结构与算法之美-堆的应用

堆的应用一:优先级队列 优先级队列首先应该是一个队列.队列最大的特性就是先进先出.但是在优先级队列中,出队顺序不是先进先出,而是按照优先级来,优先级最高的,最先出队. 用堆来实现优先级队列是最直接.最高效的.这是因为,堆和优先级队列非常相似.一个堆就可以看作一个优先级队列.很多时候,它们只是概念上的区分而已. 往优先级队列中插入一个元素,就相当于往堆中插入一个元素.从优先级队列中取出优先级最高的元素,就相当于取出堆顶元素. 很多数据结构和算法都要依赖它.比如,赫夫曼编码.图的最短路径.最小生成树

十分钟弄懂:数据结构与算法之美 - 时间和空间复杂度

复杂度分析是整个算法学习的精髓,只要掌握了它,数据结构和算法的内容基本上就掌握了一半了. 1. 什么是复杂度分析 ? 数据结构和算法解决是 "如何让计算机更快时间.更省空间的解决问题". 因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能. 分别用时间复杂度和空间复杂度两个概念来描述性能问题,二者统称为复杂度. 复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系. 2. 为什么要进行复杂度分析 ? 和性能测试相比,复杂度分析有不依赖执行环境.成本低.效率高.易操作.

数据结构与算法JavaScript描述——栈

栈就是和列表类似的一种数据结构,它可用来解决计算机世界里的很多问题. 栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样的操作很快,而且容易实现. 栈的使用遍布程序语言实现的方方面面,从表达式求值到处理函数调用. 1.对栈的操作: 栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶. 栈被称为一种后入先出的数据结构. 由于栈具有后入先出的特点,所以任何不在栈顶的元素都无法访问. 为了得到栈底的元素,必须先拿掉上面的元素. 对栈的两种主要操作是将一个元素压入栈和将一个

数据结构与算法JavaScript描述——栈的使用

有一些问题特别适合用栈来解决.本节就介绍几个这样的例子. 1) 数制间的相互转换 可以利用栈将一个数字从一种数制转换成另一种数制.假设想将数字n 转换为以b 为基数的数字,实现转换的算法如下. 使用栈,在JavaScript 中实现该算法就是小菜一碟.下面就是该函数的定义,可以将数字转化为二至九进制的数字: //============================使用Stack类==================================== /** * 1.数制间的相互转换 */