資料結構 線性表之迴圈佇列

2021-10-18 16:14:30 字數 2923 閱讀 4326

三:**

實現佇列要麼使用陣列,要麼使用鍊錶,但由於陣列對於出隊和入隊這樣的操作效率不高,所以實現佇列一般使用鍊錶。如果現在要求你使用順序表(也就是順序隊)來實現佇列,在不考慮操作的複雜性的情況下肯定是可以實現的,但是這會存在乙個致命的問題——「假溢位」。如下,經過一系列入隊出隊操作,某一刻出現越界。

一旦出現越界,這個佇列就等於「報廢」了

而解決這個問題可以用到迴圈佇列,迴圈佇列從感覺上講不是乙個直鏈,而是乙個圓環,在某一刻隊滿時,此時還要入隊的話,隊頭指標便指向第乙個元素,重複利用之前的空間

對於普通的順序隊,其判斷隊滿的條件為容量滿,對於迴圈隊來說,其判斷隊空和隊滿的條件有點不同

首先,隊空時自然rear=front,也即下圖

而後進隊兩個元素,進隊時arr[rear]=x,然後rear+1如下圖

繼續入隊,入到不能再入為止,此時rear=front,但是前面隊空時也有rear=front

所以為了區分隊空和隊滿,必須犧牲掉乙個元素的位置(圖中a8)這也就是為什麼在申請空間時需要多申請乙個原因。如下當元素到達a7時,即為設定的隊滿狀態。此時front=rear+1

在這樣乙個迴圈佇列中,佇列空間為8個,下標範圍[0-7],當rear=7時隊滿。如果繼續入隊,rear就不能直接+1了,否則會越界。而要使得rear從rear=7跳到rear=0,可以rear=(rear+1)%8,因為任何乙個數對8取餘,其結果都會被對映在[0-7]內。同時為了統一操作,將所有的rear=rear+1均改為rear=(rear+1)%8。

所以說隊空rear=front;隊滿front=(rear+1)%maxsize;移動指標rear=(rear+1)%maxsizefront=(front+1)%maxsize;

;//初始化

void

circularqueuepush

(circularqueue* pq, datatype x)

;//入隊

void

circularqueuepop

(circularqueue* pq)

;//刪除

datatype circularqueuehead

(circularqueue* pq)

;//隊頭

datatype circularqueuetail

(circularqueue* pq)

;//隊頭

circularqueue.c

#include

"circularqueue.h"

void

circularqueueinit

(circularqueue* pq)

void

print

(circularqueue* pq)

}void

circularqueuepush

(circularqueue* pq, datatype x)

void

circularqueuepop

(circularqueue* pq)

datatype circularqueuehead

(circularqueue* pq)

datatype circularqueuetail

(circularqueue* pq)

}

test.c

#include

"circularqueue.h"

void

test()

intmain()

資料結構之線性結構 線性表,堆疊,佇列

對於線性表的操作 1 建立線性表 2 確定線性表的長度 3 確定線性表是否為空 4 訪問表中指定位置的節點的值 5 查詢指定值在表中的位置 6 在表中指定位置插入乙個新節點 7 刪除表中指定位置的節點 2.線性表的鏈結儲存結構 用鏈結方式儲存的線性表稱為鍊錶。優點 不必調整節點的位址,儲存單元對儲存...

資料結構 線性表 佇列

一 佇列簡介 佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端 front 進行刪除操作,而在表的後端 rear 進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列中沒有元素時,稱為空佇列。include include typede...

mysql 線性表 資料結構之線性表

概要 參考 大話資料結構 把常用的基本資料結構梳理一下。線性表定義 線性表 list 零個或多個資料元素的有限序列。若將線性表記為 a 1,cdots,a a i,a cdots,a n 則表中 a 領先於 a i a i 領先於 a 稱 a 是 a i 的直接前驅元素,a 是 a i 的直接後繼元...