《数据结构与算法》六:栈/队列

259 阅读2分钟

本系列文章是以笔记的方式进行记录,主要内容均参考王争老师的《数据结构与算法之美》

栈是什么:后进者先出,先进者后出,这就是典型的“栈”结构
栈的操作特性:栈是一种“操作受限”的线性表,只允许在一端插入和删除数据
复杂度:栈既可以通过数组实现,也可以通过链表来实现。不管基于数组还是链表,入栈、出栈的时间复杂度都为 O(1)
应用场景:浏览器浏览地址记录、函数调用的临时变量存储、表达式求值 \

image.png

队列

队列是什么:先进者先出,这就是典型的“队列”结构。
队列的操作特性:队列也是一种“操作受限”的线性表数据结构,一端进入,一端输出。
复杂度:栈既可以通过数组实现,也可以通过链表来实现。不管基于数组还是链表,入栈、出栈的时间复杂度都为 O(1)
应用场景:比如高性能队列 Disruptor、Linux 环形缓存,都用到了循环并发队列。MQ等都是队列结构
image.png

特殊队列:循环队列
正常情况: image.png

队满情况: image.png

使用队列或者编写队列的时候需要确定好队空和队满的判定条件。
队空:head == tail
队满:中画的队满的情况,tail=6,head=7,n=8,所以总结一下规律就是:(6+7)%8=4。多画几张队满的图,你就会发现,当队满时,(tail+1)%n=head

扩展队列:阻塞队列、并发队列(可以使用锁,或者使用CAS实现无锁并发)

CAS实现的简单介绍:在入队前,获取tail位置,入队时比较tail是否发生变化,如果否,则允许入队,反之,本次入队失败。出队则是获取head位置,进行cas。

本系列其他文章:
《数据结构与算法》目录