Python数据结构与算法笔记(七):数据结构——队列,链表和哈希表

队列

看成人在排队。
在这里插入图片描述
在这里插入图片描述
在出队到最后一个元素时,再想入队,使用列表可以在后面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

栈和队列的应用:迷宫问题

使用栈解决迷宫问题

深度优先搜索需要借助栈;
广度优先搜索需要借助队列。

深度优先搜索:
找不到路就往回走。路径不一定是最短的。
在这里插入图片描述
按照上右下左的顺序,不走回头路。把走过的路径放在栈里,然后从后往前看,看哪个路能走。没有路就一直出栈。
在这里插入图片描述
找到一个出口,然后还是遵循上右下左的原则。
在这里插入图片描述
最后走出迷宫。用栈来存储走过的路径。
在这里插入图片描述

使用队列解决迷宫问题

广度优先搜索:
考虑多条路。
在这里插入图片描述
找到最近的路径。队列用来存储同时考虑的几条路径。
在这里插入图片描述
路径进队情况。队列存储的是路径分叉的终端。
在这里插入图片描述
找到终点前一个点,逐渐回溯,顺藤摸瓜。
需要存储上一个点的路径。
下面的数字是记录的索引。
在这里插入图片描述
这里代码有一些问题:

  1. print_r()函数中的’==‘应该是’!=’;
  2. maze_path_queue()中的pop(),改成popleft()。代码所使用的内置队列模块的pop()是右出队,应该使用leftpop()才对。
    感谢聪头的评论说明。
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, 1, 1, 0, 0, 1],
    [1, 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值