python数据结构之队列(queue)

1.队列

队列是一种特殊的线性表,先进先出,只允许在前端进行删除,在后端进行插入操作,它的操作方式与堆栈类似,区别在于队列只允许在后端插入数据。

在python中有相应的类:

import Queue

q = Queue.Queue()

for i in range(4):
    q.put(i) #将一个值放入队列中

while not q.empty():
    print q.get(), #将值取出
#先进先出的,你应该猜到了会输出什么。
0 1 2 3

条件:

  • 如果列表中只有一个元素,头节点和末节点均可指向它
  • 如果列表中没有元素, 头节点和末节点的指针均指向None
  • 要一个空队列出队,返回None

    2.入队

    入队需要分为两种情况:

  • 要入的队为空队列

  • 要入的队为非空队列

因此设计相应的算法:

  1. 如果列表为空,头节点和末节点均指向新节点node
  2. 否则,放到末节点之后
class Node(object):

    def __init__(self,data):
        self.data = data
        self.next = None

class Queue(object):
    def __init__(self):
        self.head = None
        self.tail = None
    def enqueue(self,data):
        node = Node(data)
        if self.head is None and self.tail is None:
            self.head = node
            self.tail = node
        else:
            self.tail.next = node
            self.tail = node

算法的时间,空间复杂度均为O(1)

3.出队

出队则要分成三种情况讨论:
要出的队列为空,只有一个节点,或者有不止一个节点,设计如下算法:

  • 如果list为空,返回None
  • if list有一个节点
    2.1 存储头节点的值
    2.2 把头,尾节点指向None
    2.3 返回头节点的值

  • else:
    3.1 存储头节点的值
    3.2 将头节点转到下一个节点
    3.3 返回头节点的值

    def dequeue(self):
        if self.head is None and self.tail is None:
            return None
        data = self.head.data
        if self.head == self.tail:
            self.head = None
            self.tail = None
        else:
            self.head = self.head.next
        return data

算法的时间,空间复杂度均为O(1)

4.后进先出队列

q = Queue.LifoQueue()

for i in range(5):
    q.put(i)

while not q.empty():
    print q.get(),
    #输出:4 3 2 1 0

你可能感兴趣的:(python)