看成人在排队。
在出队到最后一个元素时,再想入队,使用列表可以在后面append,但是前面仍然占据着一部分内存,无法处理。想个办法让其收尾连成一个圈。
队列的实现方式:环形队列
判定一个队列是否为空,rear=front。最后一个图,rear和front之间空一位,是为了更好地判别这个队列是空的还是满的。
规定空的一块空间为队满。
对最大数取余,为0时,进入从0开始的索引。
class Queue:
def __init__(self,size=100):
self.queue = [0 for _ in range(size)]
self.rear = 0 # 队尾指针
self.front = 0 # 队首指针
self.size = size
def push(self,element):
if not self.is_filled():
self.rear = (self.rear + 1) % self.size
self.queue[self.rear] = element
else:
raise IndexError('Queue is filled.')
def pop(self):
if not self.is_empty():
self.front = (self.front + 1) % self.size
return self.queue[self.front]
else:
raise IndexError('Queue is empty.')
# 判断队空
def is_empty(self):
return self.rear == self.front
# 判断队满
def is_filled(self):
return (self.rear +1) % self.size == self.front
q = Queue(5)
for i in range(4):
q.push(i)
print(q.is_filled())
True
print(q.pop())
0
python队列内置模块
from collections import deque# 双向队列
# 单向队列
q = deque()
q.append(1)# 队尾进队
q.popleft()# 队首出队
1
# 双向队列
q.appendleft(1) # 队首进队
q.pop() # 队尾出队
1
q = deque([1,2,3])
q.append(4)
q.popleft()
1
#队满之后,前面的自动出队
q = deque([1,2,3,4,5],5)
q.append(6)
q.popleft()
2
深度优先搜索需要借助栈;
广度优先搜索需要借助队列。
深度优先搜索:
找不到路就往回走。路径不一定是最短的。
按照上右下左的顺序,不走回头路。把走过的路径放在栈里,然后从后往前看,看哪个路能走。没有路就一直出栈。
找到一个出口,然后还是遵循上右下左的原则。
最后走出迷宫。用栈来存储走过的路径。
广度优先搜索:
考虑多条路。
找到最近的路径。队列用来存储同时考虑的几条路径。
路径进队情况。队列存储的是路径分叉的终端。
找到终点前一个点,逐渐回溯,顺藤摸瓜。
需要存储上一个点的路径。
下面的数字是记录的索引。
这里代码有一些问题:
maze = [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 0, 0, 1, 0, 0, 0, 1, 0, 1],
[1, 0, 0, 1, 0, 0, 0, 1, 0, 1],
[1, 0, 0, 0, 0,