資料結構與演算法 迴圈佇列

2021-10-03 04:49:34 字數 3723 閱讀 1500

迴圈佇列

實際中我們還會用到一種佇列叫做迴圈佇列,這種佇列把儲存空間前後連線起來,形成像環一樣的結構,解決了記憶體空間浪費的問題

這裡我們用順序結構來實現,因為為了防止溢位的情況,這裡我們需要多開乙個資料的空間用作緩衝,這部分不用於存資料,用於防止溢位,當陣列訪問到這一部分時就將他歸零,實現迴圈的結構。

每次入資料通過隊尾指標入,出資料通過隊首指標出,和佇列的操作方法差不多,每一步驟的具體實現思路會在下面寫出

資料結構

typedef int datatype;

typedef struct

circularqueue;

實現的介面
circularqueue* circularqueuecreate(int k);

//迴圈佇列初始化

bool circularqueueenqueue(circularqueue* obj, datatype value);

//迴圈隊列入隊

bool mycircularqueuedequeue(circularqueue* obj);

//迴圈佇列出隊

datatype circularqueuefront(circularqueue* obj);

//獲取迴圈佇列隊首

datatype circularqueuerear(circularqueue* obj);

//獲取迴圈佇列隊尾

int circularqueuesize(circularqueue* obj);

//迴圈佇列長度

bool circularqueueisempty(circularqueue* obj);

//判斷迴圈佇列是否為空

bool circularqueueisfull(circularqueue* obj);

//判斷迴圈佇列是否已滿

void circularqueuefree(circularqueue* obj);

//銷毀迴圈佇列

迴圈佇列初始化
circularqueue* circularqueuecreate(int k) 

初始化時多開乙個空間,防止溢位。入佇列

bool circularqueueenqueue(circularqueue* obj, datatype value) 

我們首先要判斷佇列是否已滿,如果滿了則返回false,為什麼使用這個公式我會在下面的判斷隊滿的函式中寫到,沒滿則將資料存到隊尾指標的位置,如果隊尾指標達到了我們多開的那個位置,則讓隊尾指標歸零出佇列

bool mycircularqueuedequeue(circularqueue* obj) 

首先判斷是否隊空,然後使隊頭指標走一步,當隊頭指標到達多開的空間時,歸零獲取隊首元素

datatype circularqueuefront(circularqueue* obj) 

獲取隊尾元素
datatype circularqueuerear(circularqueue* obj) 

獲取佇列中有效元素個數
int circularqueuesize(circularqueue* obj)

首先用隊尾位置減去隊首位置,然後因為是迴圈佇列,位置不斷變化可能會出現負數和得不到正確的結果,我們就需要先加上總長度在對總長度取模,這樣得到的才是他們真正的位置差,也就是有效元素個數檢測迴圈佇列是否為空

bool circularqueueisempty(circularqueue* obj) 

當隊首和隊尾處於同一位置時說明迴圈隊列為空,因為此時他們的相對位置為零檢測迴圈佇列是否已滿

bool circularqueueisfull(circularqueue* obj) 

當隊滿的時候隊首應該在隊尾的下乙個位置,但因為迴圈佇列位置不斷變化,可能出現超過總長度或者歸零的情況,所以我們需要對總長度取模來獲取他們的相對位置銷毀迴圈佇列

void circularqueuefree(circularqueue* obj) 

完整**

標頭檔案

#pragma once

#include #include #include typedef int datatype;

typedef struct circularqueue;

circularqueue* circularqueuecreate(int k);

//迴圈佇列初始化

bool circularqueueenqueue(circularqueue* obj, datatype value);

//迴圈隊列入隊

bool mycircularqueuedequeue(circularqueue* obj);

//迴圈佇列出隊

datatype circularqueuefront(circularqueue* obj);

//獲取迴圈佇列隊首

datatype circularqueuerear(circularqueue* obj);

//獲取迴圈佇列隊尾

bool circularqueueisempty(circularqueue* obj);

//判斷迴圈佇列是否為空

bool circularqueueisfull(circularqueue* obj);

//判斷迴圈佇列是否已滿

void circularqueuefree(circularqueue* obj);

//銷毀迴圈佇列

函式實現

#pragma once

#include "circularqueue.h"

circularqueue* circularqueuecreate(int k)

bool circularqueueenqueue(circularqueue* obj, datatype value)

bool mycircularqueuedequeue(circularqueue* obj)

datatype circularqueuefront(circularqueue* obj)

datatype circularqueuerear(circularqueue* obj)

bool circularqueueisempty(circularqueue* obj)

bool circularqueueisfull(circularqueue* obj)

void circularqueuefree(circularqueue* obj)

資料結構與演算法 佇列 迴圈佇列

部分內容來自於 資料結構 c語言版 清華大學出版社,嚴蔚敏 吳偉民 編著 如果我們將佇列設定為順序儲存結構,那麼,因為出隊的時候是從隊首出隊,入隊的時候是從隊尾入隊,而入隊需要在後面的記憶體中開闢空間,一直這樣總會把所有的記憶體耗盡.雖然我們在出隊的時候會釋放空間,但是釋放的空間是在靠前的記憶體位址...

資料結構與演算法 迴圈佇列鏈式佇列

佇列 1 也是一種操作受限的線性表,規定只能在一端插入,一端刪除,有先進先出的特點。2 順序佇列,隊首指標指向隊首元素,隊尾指標指向隊尾元素的前乙個元素,此時隊列為空的判定條件是 q.front q.rear 0 2 順序佇列會有假溢位的現象,為此設計了迴圈佇列。1 為了區分隊滿和隊空的條件,迴圈佇...

資料結構與演算法之迴圈佇列

include include define maxsize 20 迴圈佇列它的容量是固定的,並且它的對頭和隊尾指標都可以隨著元素 入佇列而發生改變。typedef char elemtype typedef struct cyclequeue 迴圈佇列的初始化 void initqueue cyc...