迴圈佇列
實際中我們還會用到一種佇列叫做迴圈佇列,這種佇列把儲存空間前後連線起來,形成像環一樣的結構,解決了記憶體空間浪費的問題
這裡我們用順序結構來實現,因為為了防止溢位的情況,這裡我們需要多開乙個資料的空間用作緩衝,這部分不用於存資料,用於防止溢位,當陣列訪問到這一部分時就將他歸零,實現迴圈的結構。
每次入資料通過隊尾指標入,出資料通過隊首指標出,和佇列的操作方法差不多,每一步驟的具體實現思路會在下面寫出
資料結構
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...