从简单的线性数据结构开始:栈与队列 | 算法必看系列三十七

简介: 在计算机领域离不开算法和数据结构,而在数据结构中尤为重要与基础的便是两个线性数据结构:栈与队列,本文将简单的介绍栈(Stack)和队列(Queue)的实现。

原文链接

在计算机领域离不开算法和数据结构,而在数据结构中尤为重要与基础的便是两个线性数据结构:栈与队列,本文将简单的介绍栈(Stack)和队列(Queue)的实现。

栈与队列

  • 栈 (Stack)是一种后进先出(last in first off,LIFO)的数据结构
  • 队列(Queue)则是一种先进先出 (fisrt in first out,FIFO)的结构

动画如下:
111.gif

队列

111.gif

栈 (Stack)

栈是一种线性结构,与数组相比,栈对应的操作是数组的子集。

它只能从一端添加元素,也只能从一端取出元素(这一端称之为栈顶)。

Stack这种数据结构用途很广泛,在计算机的使用中,大量的运用了栈,比如编译器中的词法分析器、Java虚拟机、软件中的撤销操作(Undo)、浏览器中的回退操作,编译器中的函数调用实现等等。
image.png
说明:push和pop操作在最后面进行,有可能触发resize,但均摊来算是O(1)的。
如果你想了解更多时间复杂度的分析,欢迎关注笔者后续要更新的文章:O(n)说明的是什么问题?

栈的实现可以通过 数组 或者 链表 实现,在这里我们使用 数组来实现上述接口。

在栈的设计中,用户只关注栈顶元素存取和栈长度,因此设计代码如下:
1.jpg

读者可以使用 栈 这种数据结构去解决LeetCode上的第20号问题:有效的括号,也可以查看 每天一算:Valid Parentheses。

队列 Queue

队列也是一种线性数据结构,与数组相比,队列对应的操作是数组的子集。

只能从一端 (队尾) 添加元素,只能从另一端 (队首) 取出元素。

队列的应用可以在播放器上的播放列表,数据流对象,异步的数据传输结构(文件IO,管道通讯,套接字等)上体现,当然最直观的的就是排队了。
image.png
入队是从队尾开始,有可能触发resize,因此均摊下来是O(1)。出队是在队首,数组实现每次都要挪动所有元素,O(n)。
1.jpg

来源 | 五分钟学算法
作者 | 程序员小吴

相关文章
|
2天前
栈的基本应用
栈的基本应用
10 3
|
2天前
栈与队列理解
栈与队列理解
8 1
|
2天前
|
机器学习/深度学习 存储 算法
数据结构与算法 动态规划(启发式搜索、遗传算法、强化学习待完善)
数据结构与算法 动态规划(启发式搜索、遗传算法、强化学习待完善)
8 1
|
2天前
|
存储 算法
数据结构与算法 栈与队列
数据结构与算法 栈与队列
7 0
数据结构与算法 栈与队列
|
2天前
|
C++
数据结构(顺序队列 循环队列
数据结构(顺序队列 循环队列
7 0
|
2天前
|
C++
数据结构(共享栈
数据结构(共享栈
6 0
|
2天前
|
C++
数据结构(顺序栈
数据结构(顺序栈
8 2
|
2天前
|
容器
【栈与队列】栈与队列的相互转换OJ题
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
10 0
|
3天前
|
存储
【栈】基于顺序表的栈功能实现
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
11 0
|
23小时前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。