数据结构 | 队列(Queue)

 

队列先进先出

 

1.队列的链接表实现

  只需要使用带尾结点的单链表即可,尾端插入数据,尾端删除数据和访问栈顶数据。

 

class QueueUnderFlow(ValueError):
    pass

 

 

 

class LQueue:
    def __init__(self):
        self.head = None
        self.rear = None
    
    def is_empty(self):
        return self.head == None
    
    def enqueue(self,elem):
        if self.head is None:
            self.head = LNode(elem,None)
            self.rear = self.head
        else:
            self.rear.next = LNode(elem,None)
            self.rear = self.rear.next
    
    def dequeue(self):
        if self.head is None:
            raise QueueUnderFlow("in pop")
        e = self.head.elem
        self.head = self.head.next
        return e
    
    def peek(self):
        if self.head is None:
            raise QueueUnderFlow("in pop")
        return self.head.elem

 

2. 队列的顺序表实现

  采用的是循环顺序表

尾端入队enqueue:

(self.rear+1)/q.len

首端出队dequeue

(self.head+1)/q.len

 

3.队列的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 enqueue(self,elem):
        self._elems[self._head+self._num] = elem
        self._num += 1

    def dequeue(self):
        if self.is_empty():
            raise QueueUnderFlow("in dequeue")
        e = self._elems[self._head]
        self._head = self._elems[self._head+1]/self._len
        self._num -= 1
        return e

    def peek(self):
        if self.is_empty():
            raise QueueUnderFlow("in dequeue")
        return self._elems[self._head]

    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)/self._len]
        self._elems = new_elems
        self._head = 0

 

posted @ 2020-03-22 08:57  PythonGirl  阅读(268)  评论(0)    收藏  举报