栈 & 队列

Posted wy919

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈 & 队列相关的知识,希望对你有一定的参考价值。

先进者后出,后进者先出,LIFO,典型的"栈"结构

从栈的操作特性上来看,栈是一种"操作受限"的线性表,只允许在一段插入和删除数据。

 

在功能上来说,数组和链表可以代替栈,但特定的数据结构是对特定场景的抽象,

数组或链表暴露了太多的操作接口,操作上的确灵活自由,但使用时就比较不可控,也就更容易出错。

 

当某个数据集合 只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,"栈"的存在就凸显出来了。

栈可以用数组来实现,叫顺序栈

也可以用链表来实现,叫链式栈

栈主要有两个操作:入栈push()出栈pop()

也就是在栈顶插入一个数据和从栈顶删除一个数据。

 

不管是顺序栈还是链式栈,入栈、出栈只涉及栈顶个别数据的操作。

 

技术图片

 

 

 

 

队列

先进者先出,FIFO,典型的"队列"结构。

跟栈一样也是一种操作受限的线性表数据结构。

 

队列很贴近生活中的排队,先来先买,后来者排在后面,不允许插队。

特点:先进先出,主要的两个操作:入队和出队。

跟栈的操作一般无二,数组实现的叫顺序队列,链表的是链式队列

队列只支持:入队enqueue(),放一个数据到队列尾部;

      出队dequeue(),  从队列头部取一个数据。

 

循环队列、阻塞队列、并发队列等具有某些额外特性的队列,

它们在很多偏底层系统,框架、中间件的开发中,起到了关键性作用。

 

阻塞队列 (有点生成器的味道

技术图片

 

 

就是在队列基础上添加了阻塞操作。

在队列为空的时候,从对头取数据会被阻塞。因为此时还没有数据可取,直到队列中有了数据才能返回;

如果队列满了,那么插入数据的操作就会被阻塞,直到有了空闲位置,再插入数据,然后再返回

 

使用阻塞队列 可以轻松实现一个  "生产者 - 消费者模式"。

可以有效地协调生产和消费速度。当“生产者”生产数据的速度过快,

“消费者”来不及消费时,存储数据的队列很快就满了。这个时候,生产者就阻塞等待,直到“消费者”消费了数据,

“生产者”才会被唤醒继续“生产”。

还可以通过协调“生产者”和“消费者”的个数,来提高数据的处理效率。

可以多配置几个“消费者”,来应对一个“生产者”。

 

以上是关于栈 & 队列的主要内容,如果未能解决你的问题,请参考以下文章

脑筋急转弯:如何用两个栈实现一个队列 && 如何用两个队列实现一个栈

javajava两个栈实现一个队列&两个队列实现一个栈

剑指offer(C++)-JZ9:用两个栈实现队列(数据结构-队列 & 栈)

剑指Offer 5. 用两个栈实现队列 (栈)

单调栈&单调队列

python 栈&队列&列表的区别