栈:
1 # -*- coding: utf-8 -*-
2 # @author: Tele
3 # @Time : 2019/04/24 下午 2:33
4 # 采用list(顺序表)实现栈结构,后入先出
5 class MyStack:
6 def __init__(self):
7 self.__list = list()
8
9 def is_empty(self):
10 return self.__list == list()
11
12 def size(self):
13 return len(self.__list)
14
15 # 弹出栈顶元素(删除)
16 def pop(self):
17 return self.__list.pop()
18
19 # 入栈
20 def push(self, item):
21 self.__list.append(item)
22
23 # 返回栈顶元素
24 def peek(self):
25 if self.is_empty():
26 return None
27 else:
28 return self.__list[-1]
29
30
31 def main():
32 mystack = MyStack()
33 mystack.push(1)
34 mystack.push(2)
35 mystack.push(3)
36 mystack.push(4)
37 mystack.push(5)
38 print(mystack.peek())
39 print(mystack.pop())
40 print(mystack.size())
41 print(mystack.is_empty())
42
43
44 if __name__ == '__main__':
45 main()
队列:
1 # -*- coding: utf-8 -*-
2 # @author: Tele
3 # @Time : 2019/04/28 下午 3:16
4 # 队列,先进先出
5 # 设定list的头即为队列的头,list的尾即为队列的尾
6 class Queue:
7 def __init__(self):
8 self.__list = list()
9
10 def is_empty(self):
11 return self.__list == list()
12
13 def size(self):
14 return len(self.__list)
15
16 # 入队
17 def enqueue(self, item):
18 self.__list.append(item)
19
20 # 出队,从队列头部删除一个元素
21 def dequeue(self):
22 return self.__list.pop(0)
23
24
25 def main():
26 queue = Queue()
27 queue.enqueue(1)
28 queue.enqueue(2)
29 queue.enqueue(3)
30 print(queue.dequeue())
31 print(queue.is_empty())
32 print(queue.size())
33
34
35 if __name__ == '__main__':
36 main()
双向队列:
1 # -*- coding: utf-8 -*-
2 # @author: Tele
3 # @Time : 2019/04/28 下午 3:24
4 # 双端队列,类似两个栈的栈底合并在一起
5 # 设定list的头即为队列的头,list的尾即为队列的尾
6 class DoubleQueue:
7 def __init__(self):
8 self.__list = list()
9
10 def is_empty(self):
11 return self.__list == list()
12
13 def size(self):
14 return len(self.__list)
15
16 # 在队头添加元素
17 def add_front(self, item):
18 self.__list.insert(0, item)
19
20 # 在队尾添加元素
21 def add_rear(self, item):
22 self.__list.append(item)
23
24 # 从队头删除元素
25 def remove_front(self):
26 return self.__list.pop(0)
27
28 # 从队尾删除元素
29 def remove_rear(self):
30 return self.__list.pop()
31
32
33 def main():
34 dq = DoubleQueue()
35 dq.add_front(1)
36 dq.add_front(2)
37 dq.add_rear(1000)
38 print(dq.size())
39 print(dq.is_empty())
40 print(dq.remove_front())
41 print(dq.remove_rear())
42
43
44 if __name__ == '__main__':
45 main()
队列的头尾选择与list的头尾对应关系应根据实际需要,如入队的频率高(在队尾添加元素),则队列的的尾就是list的尾,因为append的的复杂度为O(1),反之出队的频率高(从队头删除一个元素),则队列的头部为list的尾部,pop的复杂度为O(1)