佇列 queue是乙個資料集合,僅允許在列表一端插入,另一端進行刪除
進行插入的一端稱為隊尾(rear),插入動作稱為進隊或入隊
進行刪除的一端稱為隊頭(front),刪除動作稱為出隊
佇列的性質:先進先出(first in,first out)
佇列能不能用列表實現呢?
比較刪除乙個元素,列表操作的時間複雜度是o(n),這並不是我們所希望的
那如果維護兩個指標,乙個指向隊頭,乙個指向隊尾,當出隊刪除元素時,我們只要移動隊頭指標就可以了,那是不是就解決了上面的問題了,似乎是解決了,但是又引出另外乙個問題,就刪除元素的空間是還在的,這樣會很浪費空間的,那怎麼充分利用這空間呢,或者說,怎麼在進隊時,使得進隊的元素指向這些空間進行充分利用呢?
為了解決上面問題,就引出了環形佇列
環形佇列滿足下面條件:
隊首指標前進1:front = (front + 1) % maxsize
隊尾指標前進1:rear = (rear + 1) % maxsize
隊空:rear == front
隊滿: (rear + 1) % maxsize == front
class queue:def __init__(self, size=100):
self.queue = [0 for _ in range(size)]
self.size = size
self.rear = 0 #隊尾指標
self.front = 0 #隊首指標
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.")
@property
def is_empty(self):
return self.rear == self.front
@property
def is_filled(self):
return (self.rear + 1) % self.size == self.front
其中deque,第一引數是指定初始佇列值,而第二引數則是指定佇列的長度,不過它在隊滿的情況下,會自動出隊之前的值,利用這個特性我們可以實現linux命令tail取後幾行操作
from collections import dequedef tail(n):
with open('test.txt', 'r') as f:
q = deque(f, n)
return q
for line in tail(5):
print(line, end="")
利用佇列實現廣度優先走迷宮
from collections import dequemaze = [
[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, 1, 1, 1, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 1, 0, 0, 0, 0, 1],
[1, 0, 1, 0, 0, 0, 1, 0, 0, 1],
[1, 0, 1, 1, 1, 0, 1, 1, 0, 1],
[1, 1, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
]dirs = [
lambda x, y: (x + 1, y),
lambda x, y: (x - 1, y),
lambda x, y: (x, y - 1),
lambda x, y: (x, y + 1)
]def print_r(path):
curnode = path[-1]
realpath =
while curnode[2] == -1:
curnode = path[curnode[2]]
realpath.reverse()
for node in realpath:
print(node)
def maze_path_queue(x1, y1, x2, y2):
queue = deque()
path =
while len(queue) > 0:
curnode = queue.pop()
if curnode[0] == x2 and curnode[1] == y2:
# 終點
print_r(path)
return true
for dir in dirs:
nextnode = dir(curnode[0], curnode[1])
if maze[nextnode[0]][nextnode[1]] == 0:
maze[nextnode[0]][nextnode[1]] = 2 # 標記為已經走過
else:
print("沒有路")
return false
maze_path_queue(1, 1, 8, 8)
資料結構 佇列
一 佇列的迴圈陣列實現。1 初始化 空佇列。令rear front 0。2 入佇列 約定rear指向佇列尾元素的下乙個位置。入佇列時,先判斷佇列是否已滿,而後將array rear x 然後rear 3 出佇列 約定front指向佇列的首元素位置。出佇列時,先判斷佇列是否為空,而後返回隊首元素re ...
資料結構 佇列
資料參考自 資料結構c 語言描述 佇列是一種先進先出的資料結構,這與棧正好相反。下例是簡單的queue實現 queue.h檔案 ifndef queue h define queue h include include 資料元素結構 自定義 struct datatype 佇列元素最大數 const...
資料結構 佇列
code for fun created by dream whui 2015 1 25 include stdafx.h include include using namespace std define true 1 define false 0 define ok 1 define erro...