栈、队列、循环队列、双端队列、优先级队列04

栈:FILO。先进后出。也就是只能从一个方向进出。push()入栈,pop()出栈。peek。返回栈顶元素而不出栈。栈的入栈和出栈都是O(1)。

队列:FIFO。先进先出。在队列尾部只能插入,而在头部只能删除。插入时候,尾部指针加一,指向后面的空位置。删除时候,头部指针加一,指向后面存在的数据。

因此可以看出,队列通过移动指针的方式而不是移动移动数据项的方式保证了插入删除的低复杂度。他们的复杂的都是O(1)。但是这种方式可能会导致。头部尾部指针越来越大

造成下面很多空间没有利用。因此引入循环队列的概念

循环队列:当你是使用链表去实现队列的化,基本不需要循环队列。因为你的长度可以变化。如果使用的是数组去实现的队列。那么,要时刻判断队尾是否以及到达数组的边界,

一旦要超出,则将队尾指针复位,也就是-1.。循环队列插入和删除的复杂度也都是O(1)

双端队列:用的较少。也就是两端都可以作为入口或者出口。如果禁用了leftRemove和leftInsert。则此时双端队列可以看作是普通的栈。因为只能右进右出。

如果禁用了leftRemove 和 rightInsert。此时只能从左进从右出。也就是和普通的队列一样了哈哈哈。

优先级队列:如果用数组当底层实现。由于有优先级,插入复杂度O(N),删除的复杂度O(1)。删除永远删除优先级最高的。

原文地址:https://www.cnblogs.com/exceptionblog/p/8423784.html