队列实现三种方法
1、数组实现‘
class Array(object):
def __init__(self,size=32):
self._size=size
self._item=[None]*size
def getitem(self,index):
return self._item[index]
def setitem(self,index,value):
self._item[index]=value
def _len_(self):
return self.size
def __iter__(self):
for item in self._item:
yield item
def clear(self,value=None):
for i in range(len(self._item)):
self._item[i]=value
class Arrayqueue(object):
def __init__(self,maxsize):
self.maxsize=maxsize
self.array=Array(maxsize)
self.head=0
self.tail=0
def push(self,value):
if len(self)>self.maxsize:
raise Exception("full")
self.array[self.head % self.maxsize]=value
self.head+=1
def pop(self):
value=self.array[self.tail % self.maxsize]
self.tail+=1
return value
def len(self):
return self.head-self.tail
2、链表实现队列
class LinkedList(object):
""" 链接表 ADT
[root] -> [node0] -> [node1] -> [node2]
"""
def __init__(self, maxsize=None):
"""
:param maxsize: int or None, 如果是 None,无限扩充
"""
self.maxsize = maxsize
self.root = Node() # 默认 root 节点指向 None
self.tailnode = None
self.length = 0
def __len__(self):
return self.length
def append(self, value): # O(1)
if self.maxsize is not None and len(self) >= self.maxsize:
raise Exception('LinkedList is Full')
node = Node(value) # 构造节点
tailnode = self.tailnode
if tailnode is None: # 还没有 append 过,length = 0, 追加到 root 后
self.root.next = node
else: # 否则追加到最后一个节点的后边,并更新最后一个节点是 append 的节点
tailnode.next = node
self.tailnode = node
self.length += 1
def appendleft(self, value):
headnode = self.root.next
node = Node(value)
self.root.next = node
node.next = headnode
self.length += 1
def __iter__(self):
for node in self.iter_node():
yield node.value
def iter_node(self):
"""遍历 从 head 节点到 tail 节点"""
curnode = self.root.next
while curnode is not self.tailnode: # 从第一个节点开始遍历
yield curnode
curnode = curnode.next # 移动到下一个节点
yield curnode
def remove(self, value): # O(n)
""" 删除包含值的一个节点,将其前一个节点的 next 指向被查询节点的下一个即可
:param value:
"""
prevnode = self.root #
curnode = self.root.next
for curnode in self.iter_node():
if curnode.value == value:
prevnode.next = curnode.next
del curnode
self.length -= 1
return 1 # 表明删除成功
else:
prevnode = curnode
return -1 # 表明删除失败
def find(self, value): # O(n)
""" 查找一个节点,返回序号,从 0 开始
:param value:
"""
index = 0
for node in self.iter_node(): # 我们定义了 __iter__,这里就可以用 for 遍历它了
if node.value == value:
return index
index += 1
return -1 # 没找到
def popleft(self): # O(1)
""" 删除第一个链表节点
"""
if self.root.next is None:
raise Exception('pop from empty LinkedList')
headnode = self.root.next
self.root.next = headnode.next
self.length -= 1
value = headnode.value
del headnode
return value
def clear(self):
for node in self.iter_node():
del node
self.root.next = None
self.length = 0
######################################################
# 下边是 Queue 实现
######################################################
class EmptyError(Exception):
"""自定义异常"""
pass
class Queue(object):
def __init__(self, maxsize=None):
self.maxsize = maxsize
self._item_link_list = LinkedList()
def __len__(self):
return len(self._item_link_list)
def push(self, value): # O(1)
""" 队尾添加元素 """
return self._item_link_list.append(value)
def pop(self):
"""队列头部删除元素"""
if len(self) <= 0:
raise EmptyError('empty queue')
return self._item_link_list.popleft()