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

队列

看成人在排队。
Python数据结构与算法笔记(七):数据结构——队列,链表和哈希表_第1张图片
Python数据结构与算法笔记(七):数据结构——队列,链表和哈希表_第2张图片
在出队到最后一个元素时,再想入队,使用列表可以在后面append,但是前面仍然占据着一部分内存,无法处理。想个办法让其收尾连成一个圈。
队列的实现方式:环形队列
判定一个队列是否为空,rear=front。最后一个图,rear和front之间空一位,是为了更好地判别这个队列是空的还是满的。
规定空的一块空间为队满。
Python数据结构与算法笔记(七):数据结构——队列,链表和哈希表_第3张图片
对最大数取余,为0时,进入从0开始的索引。
Python数据结构与算法笔记(七):数据结构——队列,链表和哈希表_第4张图片

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队列内置模块

Python数据结构与算法笔记(七):数据结构——队列,链表和哈希表_第5张图片
Python数据结构与算法笔记(七):数据结构——队列,链表和哈希表_第6张图片

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

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

Python数据结构与算法笔记(七):数据结构——队列,链表和哈希表_第7张图片

使用栈解决迷宫问题

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

深度优先搜索:
找不到路就往回走。路径不一定是最短的。
Python数据结构与算法笔记(七):数据结构——队列,链表和哈希表_第8张图片
按照上右下左的顺序,不走回头路。把走过的路径放在栈里,然后从后往前看,看哪个路能走。没有路就一直出栈。
Python数据结构与算法笔记(七):数据结构——队列,链表和哈希表_第9张图片
找到一个出口,然后还是遵循上右下左的原则。
Python数据结构与算法笔记(七):数据结构——队列,链表和哈希表_第10张图片
最后走出迷宫。用栈来存储走过的路径。
Python数据结构与算法笔记(七):数据结构——队列,链表和哈希表_第11张图片

使用队列解决迷宫问题

广度优先搜索:
考虑多条路。
Python数据结构与算法笔记(七):数据结构——队列,链表和哈希表_第12张图片
找到最近的路径。队列用来存储同时考虑的几条路径。
Python数据结构与算法笔记(七):数据结构——队列,链表和哈希表_第13张图片
路径进队情况。队列存储的是路径分叉的终端。
Python数据结构与算法笔记(七):数据结构——队列,链表和哈希表_第14张图片
找到终点前一个点,逐渐回溯,顺藤摸瓜。
需要存储上一个点的路径。
下面的数字是记录的索引。
在这里插入图片描述
这里代码有一些问题:

  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, 

你可能感兴趣的:(队列,链表,列表,数据结构,python)