資料結構 佇列

2022-05-06 14:51:12 字數 3034 閱讀 9301

佇列 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 deque

def 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 deque

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, 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...