队列
- 定义
通俗点的定义就是,排队买票,先到的先买。就是先进先出。队列和栈一样都是操作受限的线性表数据结构
- 入队,出队
在队尾入队,队头出队。同样想象买票的流程。除非你经常插队要不很容易理解!
- 实现方式
顺序队列:用数组实现的队列
链式队列:用链表实现的队列
- 时间复杂度
1、顺序队列的python代码实现
首先说一下顺序队列的实现过程。与栈只需要一个栈顶指针不同,队列需要两个指针一个指向队头,一个指向队尾。
在入队和出队操作之后,指针的位置就会后移,因数组的长度限制,当队尾指向数组尾部下标的时候无法后移。如果出队一次进行一次数据迁移就不会有这种问题,但是时间复杂度就会由O(1)变为O(n)。所以解决办法就是当没有空闲时间之后,才进行一次大的数据迁移。
如图:红色为队头蓝色为队尾。如果每操作一次出队,就进行一次数据迁移,那么时间复杂度就会变为O(n),如果无法插入时再进行数据前移,那么出队的时间复杂度仍然是O(1)。入队的时间复杂度就会由O(1),变为n-1次O(1)加上一次O(n)。均摊时间复杂度就是O(1).
python没有数组,有列表,列表是由对其它对象的引用组成的连续数组。指向这个数组的指针及其长度被保存在一个列表头结构中。这就意味着每次进行增删操作都需要对数组的大小进行重新分配。这样的结构在对列表进行操作时的时间复杂度会很高。为了避免这种情况,这里要引入分配槽的概念,分配槽的大小不等同于列表大小,分配槽大小是指在内存中已经分配了的槽空间数。这样能避免每次列表添加数据都调用分配函数,这样均摊的时间复杂度就会比较低。增长模式为:0,4,8,16,25,35,46,58,72,88……。所以python实现队列并对队列进行操作时,与正常数组实现的队列不大一样(因为我的开发语言是python所以有时会对python一些特性进行分析)
因python列表的特性,进行删除操作时的时间复杂度为O(N).所以在进行出队时不要进行删除操作。留到数据迁移时同时进行
- 代码实现
- 顺序队列
class queues:
def __init__(self):
self.items = []
self._len = None
self._head = 0
self._taile = 0
def _pop(self):
if self.items:
re_data = self.items[self._head]
self._head = self._head + 1
if self._head == 10:
self._kuorong()
return re_data
else:
return None
def _push(self,data):
self._taile = self._taile + 1
self.items.append(data)
def _kuorong(self):
self.items = self.items[self._head:self._taile]
self._head = 0
self._taile = len(self.items)
2.链式队列
class Node(object):
def __init__(self,data,next=None):
self.data = data
self.next = next
class equeue:
def __init__(self):
self.headnode = Node(None)
self.rear = None
def _push(self,data):
NewNode = Node(data)
if not self.rear:
self.headnode.next = NewNode
self.rear = NewNode
else:
self.rear.next = NewNode
self.rear = NewNode
def _pop(self):
result = self.headnode.next
if self.headnode.next:
self.headnode.next = self.headnode.next.next
else:
return None
return result.data
3.循环队列
class queues:
def __init__(self):
self.items = [None]*10
self._len = None
self._head = 0
self._taile = 0
def _pop(self):
if self.items[self._head] != None:
print(self.items[self._head])
re_data = self.items[self._head]
self.items[self._head] = None
self._head = self._head + 1
if self._head == 10:
self._head = 0
return re_data
return None
def _push(self,data):
#print(self._taile,self.items[self._taile])
if self.items[self._taile] == None:
self.items[self._taile] = data
self._taile = self._taile + 1
if self._taile == 10:
self._taile = 0
else:
#print("队满")
pass
代码是自己编的,都能实现功能。如果发现问题或有更优化的代码请评论!!!
本文由博主学习总结而来,如果有错误的地方请指正。有多处借鉴!借鉴于
https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzI5OTIyMjQxMA==&scene=124#wechat_redirect
https://time.geekbang.org/column/article/40961
万分感谢马老师和王争大佬的知识分享!