链表实现队列:
尾部 添加数据,效率为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)