- 队列基础定义
队列:一种有次序的数据集合。其特点是新数据项的添加总发生在尾端(rear)而现存数据项的移除总发生在另一端(首端front),先进先出。
队列只有一个入口,一个出口。当数据加入队列,首先出现在队尾,随着首数据项的移除,它逐渐接近队首。不允许数据项直接插入队中,也不允许从中间移除数据项(可联想成水管流动,排队等情况)
- 抽象数据类型Queue类型-python
Queue() | 创建一个空队列对象,返回值为Queue对象 |
enqueue(item) | 将数据项item添加到队尾,无返回值 |
dequeue() | 从队首移除数据项,返回值为队首数据项,队列被修改 |
isEmpty() | 测试队列是否为空,返回值为bool类型 |
size() | 返回队列中数据项的个数 |
用python自定义一个队列:
1 class Queue: 2 def __init__(self): 3 self.items = [] 4 5 def isEmpty(self): 6 return self.items == [] 7 8 def enqueue(self, item): #复杂度O(n) 9 self.items.insert(0,item) 10 11 def dequeue(self): #复杂度O(1) 12 return self.items.pop() 13 14 def size(self): 15 return len(self.items) 16 Q = Queue() 17 Q.enqueue(0) 18 Q.enqueue(1) 19 Q.enqueue('a') 20 print(Q.size())
[OUT] 3 Process finished with exit code 0
- 队列的应用
- 热土豆问题(约瑟夫问题)
问题描述:传烫手的热土豆,鼓声停的时候,手里有土豆的小朋友需要出列。(不想敲字了,直接截图PPT)
分析:用队列来实现。用Queue存放所有参加游戏的人名,队首默认为拥有土豆的人,游戏开始,队首的人出列,然后随即到队尾入队,记为土豆的一次传递,传了num次后,将队首的人移除,不再入队,如此反复,直到队列中只剩一个人。
代码:
1 from queue1 import Queue 2 3 def hotPotato(namelist, num): 4 simqueue = Queue() 5 6 for name in namelist: 7 simqueue.enqueue(name) 8 9 while simqueue.size() >1: 10 for i in range(num): 11 simqueue.enqueue(simqueue.dequeue()) #一次传递 12 13 simqueue.dequeue() 14 return simqueue.dequeue() 15 print(hotPotato(['a','b','c','d','e','f','g'],7))
d
Process finished with exit code 0