(remove的参数是元素,pop的参数是下标。)
(1)b中如果让a出队,后面的bcde都需要往前挪,时间复杂度为O(n)
(2)c中如果让front指向+1的位置,不管a,也可以做到a出队列的操作。但是如果到了最后只剩e再想入队的话,前后都没有位置了。如果用python的列表append的话,虽然可以扩充,但是很可能一系列的入队出队操作之后占了大量的内存,有用的很少。
用环形队列的方式解决问题。
(1)rear=front,空队列。
(2)入队一圈之后,怎样让11变回0?
取余。(rear【或者front】+1)对12取余,12是队列的大小。
(3)上图6,说明队列是满的。空着一个,是为了判定队空还是队满。牺牲一小块空间定义为队满。rear+1=front定义为队满。
下图错误:front == Maxsize - 1 时,再前进一个位置就自动到0。
class Quene:
def __init__(self, size=100):
self.quene = [0 for _ in range(size)]
self.size = size
self.rear = 0 # 队尾(进队)
self.front = 0 # 队首(出队)
def push(self, element):
if not self.is_filled():
self.rear = (self.rear + 1) % self.size
self.quene[self.rear] = element
else:
raise IndexError('Quene is filled')
def pop(self): # front不指向元素
if not self.is_empty():
self.front = (self.front+1)% self.size
return self.quene[self.front]
else:
raise IndexError('Quene is empty')
def is_empty(self):
return self.rear == self.front
def is_filled(self):
return (self.rear+1) % self.size == self.front
q = Quene(5)
for i in range(4):
q.push(i)
print(q.pop())
q.push(4)
print(q.pop())