2. 数据结构与算法python描述:队列

从我自己博客粘贴过来的,这里没图

**
原文地址: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开始,从头开始

‘’’
用数组实现一个队列
‘’’

扫描二维码关注公众号,回复: 11361734 查看本文章

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()

代码:https://github.com/yiouejv/python_data_stract_algorithm

猜你喜欢

转载自blog.csdn.net/qq767852841/article/details/95640597