从我自己博客粘贴过来的,这里没图
**
原文地址:https://kongping.net/blog/post/2807/
队列
先进先出:FIFO
使用单链表实现队列
‘’’
用单链表实现队列
‘’’
class Node(object):
def init(self, value=None, next=None):
self.value = value
self.next = next
class LinkedList(object):
def init(self, maxsize=None):
self.maxsize = maxsize
self.root = Node()
self.tailnode = None
self.length = 0
def __len__(self):
return self.length
def append(self, value):
if self.maxsize is not None and len(self) >= self.maxsize:
raise Exception('链表满了!')
tailnode = self.tailnode
node = Node(value)
if tailnode is not None:
tailnode.next = node
else:
self.root.next = node
self.tailnode = node
self.length += 1
def popleft(self):
headnode = self.root.next
if headnode is None:
raise Exception('链表为空!')
self.root.next = headnode.next
value = headnode.value
del headnode
self.length -= 1
return value
class FullError(Exception):
pass
class EmptyError(Exception):
pass
class Queue(object):
def init(self, maxsize=None):
self.maxsize = maxsize
self._items = LinkedList(maxsize)
def __len__(self):
return len(self._items)
def push(self, value):
'''入队操作'''
if self.maxsize is not None and len(self) >= self.maxsize:
raise FullError('Queue Full')
self._items.append(value)
def pop(self):
if len(self) <= 0:
raise EmptyError('Queue Empty')
return self._items.popleft()
def test_queue():
q = Queue()
q.push(1)
q.push(2)
q.push(3)
assert q.pop() == 1
assert q.pop() == 2
assert q.pop() == 3
assert len(q) == 0
if name == ‘main’:
test_queue()
使用数组来实现队列
需要借助两个指针,head和tail,push时head指针往后移,pop时tail指针往后移
判断队列满:head - tail + 1 > size (数组容量)
判断为空:尾指针和头指针指向同一个位置
循环使用数组:当头指针指向最后一个位置时,又从0开始,从头开始
‘’’
用数组实现一个队列
‘’’
class Array(object):
def init(self, size=None):
‘’’
初始化数组
:param size: 数组容量
‘’’
self.size = size
self._items = [None] * size
def __getitem__(self, index):
return self._items[index]
def __setitem__(self, index, value):
self._items[index] = value
def clear(self):
for i in range(self.size):
self._items[i] = None
def __iter__(self):
for i in range(self.size):
yield self._items[i]
class FullError(Exception):
pass
class EmptyError(Exception):
pass
class ArrayQueue(object):
def init(self, size):
self.size = size
self.array = Array(size)
self.head = 0 # 头指针
self.tail = 0 # 尾指针
def push(self, value):
if self.head - self.tail + 1 > self.size:
raise FullError('Queue full')
self.array[self.head % self.size] = value
self.head += 1
def pop(self):
if self.head == self.tail:
raise EmptyError('Queue Empty')
value = self.array[self.tail % self.size]
self.tail += 1
return value
def test_array_queue():
q = ArrayQueue(5)
q.push(1)
q.push(2)
q.push(3)
q.push(4)
q.push(5)
# q.push(6) # 报错
assert q.pop() == 1
assert q.pop() == 2
assert q.pop() == 3
assert q.pop() == 4
assert q.pop() == 5
# assert q.pop() == 6 # 报错
if name == ‘main’:
test_array_queue()