数据结构:队列 链表,顺序表和循环顺序表实现(python版)


链表实现队列:

  尾部 添加数据,效率为0(1)  

  头部 元素的删除和查看,效率也为0(1)

 

顺序表实现队列:

  头部 添加数据,效率为0(n)  

  尾部 元素的删除和查看,效率也为0(1)

 

循环顺序表实现队列:

  尾部 添加数据,效率为0(1)  

  头部 元素的删除和查看,效率也为0(1)

 

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 class QueueUnderflow(ValueError):  5     pass
 6 
 7 #链表节点
 8 class Node(object):  9     def __init__(self, elem, next_ = None):  10         self.elem = elem  11         self.next = next_  12 
 13 #链表实现队列,头部删除和查看O(1),尾部加入O(1)
 14 class LQueue(object):  15     def __init__(self):  16         self._head = None  17         self._rear = None  18 
 19     def is_empty(self):  20         return self._head is None  21 
 22     #查看队列中最早进入的元素,不删除
 23     def peek(self):  24         if self.is_empty():  25             raise QueueUnderflow  26         return self._head.elem  27 
 28     #将元素elem加入队列,入队
 29     def enqueue(self, elem):  30         p = Node(elem)  31         if self.is_empty():  32             self._head = p  33             self._rear = p  34         else:  35             self._rear.next = p  36             self._rear =p  37 
 38     #删除队列中最早进入的元素并将其返回,出队
 39     def dequeue(self):  40         if self.is_empty():  41             raise QueueUnderflow  42         result = self._head.elem  43         self._head = self._head.next  44         return result  45 
 46 #顺序表实现队列,头部删除和查看O(1),尾部加入O(n)
 47 class Simple_SQueue(object):  48     def __init__(self, init_len = 8):  49         self._len = init_len  50         self._elems = [None] * init_len  51         self._num = 0  52 
 53     def is_empty(self):  54         return self._num == 0  55 
 56     def is_full(self):  57         return self._num == self._len  58 
 59     def peek(self):  60         if self._num == 0:  61             raise QueueUnderflow  62         return self._elems[self._num-1]  63 
 64     def dequeue(self):  65         if self._num == 0:  66             raise QueueUnderflow  67         result = self._elems[self._num-1]  68         self._num -= 1
 69         return result  70 
 71     def enqueue(self,elem):  72         if self.is_full():  73             self.__extand()  74         for i in range(self._num,0,-1):  75             self._elems[i] = self._elems[i-1]  76         self._elems[0] = elem  77         self._num += 1
 78 
 79     def __extand(self):  80         old_len = self._len  81         self._len *= 2
 82         new_elems = [None] * self._len  83         for i in range(old_len):  84             new_elems[i] = self._elems[i]  85         self._elems = new_elems  86 
 87 
 88 #循环顺序表实现队列,头部删除和查看O(1),尾部加入O(1)
 89 class SQueue(object):  90     def __init__(self, init_num = 8):  91         self._len = init_num  92         self._elems = [None] * init_num  93         self._head = 0  94         self._num  = 0  95 
 96     def is_empty(self):  97         return self._num == 0  98 
 99     def peek(self): 100         if self.is_empty(): 101             raise QueueUnderflow 102         return self._elems[self._head] 103 
104     def dequeue(self): 105         if self.is_empty(): 106             raise QueueUnderflow 107         result = self._elems[self._head] 108         self._head = (self._head + 1) % self._len 109         self._num -= 1
110         return result 111 
112     def enqueue(self, elem): 113         if self._num == self._len: 114             self.__extand() 115         self._elems[(self._head + self._num) % self._len] = elem 116         self._num += 1
117 
118     def __extand(self): 119         old_len = self._len 120         self._len *= 2
121         new_elems = [None] * self._len 122         for i in range(old_len): 123             new_elems[i] = self._elems[(self._head + i) % old_len] 124         self._elems, self._head = new_elems, 0 125 
126 
127 
128 if __name__=="__main__": 129     q = SQueue() 130     for i in range(8): 131  q.enqueue(i) 132     #for i in range(8):
133     # print(q.dequeue())
134     #print(q._num)
135     q.enqueue(8) 136     print(q._len)

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM