队列(Queue)
一、概述
队列只允许表的一端(队尾rear)入队,并在另一端(队头front)出队。这与日常排队是类似的,遵守先进先出(FIFO:First In First Out)的原则,规则如下图所示
二、队列的基本操作
Q.enqueue(e):向队尾添加一个元素e
Q.dequeue():从队列中移除并返回第一个元素,如果队列空,则error
Q.first():在不移除的前提下,返回队列的第一个元素,若队空,则error
Q.is_empty():若队列中不含有任何元素,则返回 布尔值TRUE
Q.len():返回队列中的元素的个数,也称为队列的长度
使用python实现以上操作:
若已有一个列表(List)L,则:
队列操作 | python实现 |
---|---|
Q.enqueue(e) | L.append(e) |
Q.dequeue() | L.pop(0) |
Q.first() | L[0] |
Q.is_empty() | len(L)==0 |
Q.len() | len(Q) |
用python实现:
class Queue:
def __init__(self,):
self._data=[]
def Que_in(self,e):
self._data.append(e)
def Que_out(self):
return self._data.pop(0)
def Que_first(self):
return self._data[0]
def Que_isEmpty(self):
return len(self._data)==0
def Que_len(self):
return len(self._data)
Queue1=Queue()
print(Queue1.Que_isEmpty())
Queue1.Que_in('J')
Queue1.Que_in('a')
Queue1.Que_in('v')
Queue1.Que_in('A')
print(Queue1.Que_isEmpty())
print(Queue1.Que_first())
print(Queue1.Que_len())
Queue1.Que_out()
print(Queue1.Que_first())
print(Queue1.Que_len())
运行结果如下:
三、循环队列
将顺序队列臆造为一个环状的空间,把存储队列元素的表从逻辑上视为一个环。新的元素依然在队尾入队,假设数组的固定长度(总容量)为n,第一个元素索引为f,逐渐将元素从队列的前面插入索引为n-1的位置。如下图所示
在删除元素并且更新索引时,可以用 f=(f+1)%N来进行更新。(%为取模运算,即整数除法后取余数的值)
例如队列的固定长度为7(总的可以放下7个元素),队头在索引为2 的地方,此时让队头元素出队,则(2+1)%7=3,队头更新为索引为3。
在添加元素时,使用 **r=(f+Q.size)%len(Q)**来更新队尾索引,其中r为队尾的索引,f是队头的索引,Q.size表示当前队列里有几个元素,len(Q)表示队列的总容量或者说固定长度。例如,固定长度为7的队列,队尾当前在4,队头当前在6,此时向队尾添加一个元素,则(6+7)%7=6,即队尾索引更新为6。
用python来实现:
class Queue:
def __init__(self,):
self._data=[None]*10
self._size=0
self._front=0
def Que_in(self,e):
if self._size==len(self._data):
self.resize(2*len(self._data))
rearNum=(self._front+self._size)%len(self._data)
self._data[rearNum]=e
self._size+=1
def resize(self,num):
old=self._data
self._data=[None]*num
walk=self._front
for k in range(self._size):
self._data[k]=old[walk]
walk=(1+walk)%len(old)
self._front=0
def Que_out(self):
if self.Que_isEmpty()==True:
print('the Q is empty')
result=self._data[self._front]
self._data[self._front]=None
self._front=(self._front+1)%len(self._data)
self._size-=1
return result
return self._data.pop(0)
def Que_first(self):
return self._data[self._front]
def Que_isEmpty(self):
return len(self._data)==0
def Que_size(self):
return self._size
def Que_len(self):
return len(self._data)
Queue1=Queue()
print(Queue1.Que_isEmpty())
Queue1.Que_in('p')
Queue1.Que_in('y')
Queue1.Que_in('t')
Queue1.Que_in('h')
Queue1.Que_in('o')
Queue1.Que_in('n')
Queue1.Que_in('c')
Queue1.Que_in('C++')
Queue1.Que_out()
Queue1.Que_out()
Queue1.Que_out()
Queue1.Que_in('C#')
#Queue1.Que_in('Java')
print(Queue1.Que_first())
print(Queue1.Que_size())
四、python 中提供了相应的queue库
基本用法如下:
import queue#导入队列库
q=queue.Queue()#创建队列对象
q.put(1)#在队尾插入元素
q.put(2)#继续在队尾插入无元素
print(q.queue)#查看队列
n=q.get()#删除并返回删除的队头元素
print(n)
print(q.queue)