python 使用顺序表实现栈和队列

栈:

 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)

原文地址:https://www.cnblogs.com/tele-share/p/10784332.html