队列
先进先出,常见的缓存结构
'''
ADT Queue:
Queue(self) #创建空队列
is_empty(self) #判断是否为空
enqueue(self) #入队
dequeue(self) #出队
peek(self) #查看
'''
a)实现
'''队列的链接表实现'''
class StackUnderflow(ValueError): #空栈访问
pass
class LNode(): #定义表节点类
def __init__(self,elem,next_=None):
self.elem=elem
self.next=next_
class LQueue: #基于链表技术实现的队列类,用LNode作为结点
def __init__(self):
self._head=None
self._rear=None
def is_empty(self):
return self.head is None
def enqueue(self,elem): #入队
if self._head is None:
self._head=LNode(elem,self._head)
self._rear=self._head
else:
self._head=LNode(elem,self._head)
def dequeue(self): #出队
if self._head is None:
raise StackUnderflow('in pop_last')
p=self._head
if p.next is None:
e=p.elem
self._head=None
self._rear=self._head
return e
while p.next.next is not None:
p=p.next
e=p.next
p.next=None
self._rear=p
return e
def peek(self): #查看
if self._head is None:
raise StackUnderflow('in pop_last')
e=self._rear.elem
return e
'''
入队和查看是O(1)操作,出队是O(n)操作
'''
'''队列的list实现(循环队列)'''
class SQueue():
def __init__(self,init_len=8):
self._len = init_len #存储区长度
self._elems = [0]*init_len #元素存储
self._head = 0 #表头元素下标
self._num = 0 #元素个数
def is_empty(self):
return self._num ==0
def peek(self):
if self._num == 0:
raise StackUnderflow
return self._elems[self._head]
def dequeue(self):
if self._num == 0:
raise StackUnderflow
e = self._elems[self._head]
self._head = (self._head+1) % self._len
self._num -= 1
return e
def enqueue(self,e):
if self._num == self._len:
self.__extend()
self._elems[(self._head+self._num) % self._len] = e
self._num +=1
def __extend(self): #扩充
old_len = self._len
self._len *= 2
new_elems = [0]*self._len
for i in range(old_len):
new_elems[i] =self._elems[(self._head+i)%old_len]
self._elems,self._head = new_elems,0
'''
入队,出队,查看都是O(1)操作,还有扩充功能。
'''