数据结构 循环队列 回顾练习

循环链表的入队操作0(1) 出队操作0(1)

 

#!/usr/bin/env python3

class QueueUnderflow(ValueError):
        pass

class CQueue(object):
        def __init__(self, init_len=8):
                self.len = init_len
                self._elems = [None] * init_len
                self.head = 0
                self.num = 0

        def is_empty(self):
                return self.num == 0

        def is_full(self):
                return self.num == self.len

        def peek(self):
                if self.num == 0:
                        raise QueueUnderflow
                e = self._elems[self.head]
                return e

        def dequeue(self):
                if self.num == 0:
                        raise QueueUnderflow
                e = self._elems[self.head]
                self.head = (self.head + 1) % self.len
                self.num -= 1
                return e

        def enqueue(self, elem):
                if self.is_full():
                        self._extends()
                self._elems[(self.head + self.num) % self.len] = elem
                self.num += 1

        def _extends(self):
                old_len = self.len
                self.len = old_len * 2
                new_elems = [None] * self.len
                for i in range(old_len):
                        new_elems[i] = self._elems[(self.head + i) % old_len]
                self._elems, self.head = new_elems, 0

        def bianli(self):
                li = []
                for i in range(self.num):
                        li.append(self._elems[(self.head+i) % self.len])
                return li

if __name__ == '__main__':
        cq = CQueue()
        for i in range(12):
                cq.enqueue(i)
        print(cq.bianli())
        cq.dequeue()
        cq.dequeue()
        print(cq.bianli())

 

posted @ 2017-02-19 18:46  小黄人python  阅读(710)  评论(0编辑  收藏  举报