通用迴圈佇列的實現

2021-08-11 15:00:54 字數 4866 閱讀 3895

通用迴圈佇列,這兒是我的筆記,希望大家可以友好交流!!謝謝#__#

有好幾天沒寫了,一直和朋友玩,都沒空看了。

今天得空寫了一下佇列的實現,還是和之前一樣,有鍊錶的方式和陣列的方式兩種。

先是陣列的形式吧,佇列結構:

struct xhqueue

;

佇列一般實現為迴圈的,即有固定大小的,可以節省空間。這裡仍然像實現棧那樣,先動態分配一片固定大小的空間給佇列。

陣列式的實現介面如下:

#include

#include

#include

typedef (*operate)();

typedef

enum

bool;

struct xhqueue;

typedef

struct xhqueue xhqueue;

typedef

struct xhqueue* xhqueue_t;

xhqueue_t queue_init(xhqueue_t que,int n);

bool queue_isempty(const xhqueue_t que);

bool queue_isfull(const xhqueue_t);

void* queue_front(const xhqueue_t que);//直插詢

bool queue_dequeue(xhqueue_t que, operate op, void** data);

bool queue_enqueue(xhqueue_t que,void* data);

bool queue_deleteall(xhqueue_t que,operate op, void** data);

int queue_getcapacity(xhqueue_t que);

int queue_getlen(xhqueue_t que);

#endif

xhqueue_t queue_init(xhqueue_t que,int n);

佇列初始化時將front指向0,rear指向-1,因為每次入列前rear先加1;

bool queue_isempty(const xhqueue_t que);

判空函式,判斷標誌由len是否為0(因為每次入列是len+1,出列時len-1)

bool queue_isfull(const xhqueue_t);

判滿函式,capacity和len是否相等

void* queue_front(const xhqueue_t que);

只查詢隊首元素

bool queue_dequeue(xhqueue_t que, operate op, void** data);

出佇列函式,其實就是front+1;

bool queue_enqueue(xhqueue_t que,void* data);

入隊函式

bool queue_deleteall(xhqueue_t que,operate op, void** data);

刪除整個佇列,包括佇列結構

int queue_getcapacity(xhqueue_t que);

int queue_getlen(xhqueue_t que);

接著實現的介面

#include"tongyongxunhuanduilie.h"

struct xhqueue

;xhqueue_t queue_init(xhqueue_t que,int n)

else

}bool queue_isempty(const xhqueue_t que)

bool queue_isfull(const xhqueue_t que)

void* queue_front(const xhqueue_t que)//只查詢

bool queue_dequeue(xhqueue_t que, operate op, void** data)

que->front = (que->front++)%que->capacity;

que->len_queue--;

return

true;

}bool queue_enqueue(xhqueue_t que,void* data)

bool queue_deleteall(xhqueue_t que,operate op, void** data)

free(que->data);

que->data = null;

free(que);

que= null;

return

true;

}int queue_getcapacity(xhqueue_t que)

int queue_getlen(xhqueue_t que)

以上是陣列式的佇列,我們還可以實現為鏈式迴圈佇列

佇列結構

struct node

;struct xhqueue

;

注意實現是帶有頭結點和尾結點(即這兩個結點實際上是不儲存data的,方便佇列操作和實現的,所以容量實際比最大有效長度多2 ),因此,在訪問隊首元素是也是要用front->next來訪問。

介面:

typedef (*operate)();

typedef

enum

bool;

struct node;

typedef

struct node node;

typedef

struct node* node_t;

struct queue;

typedef

struct xhqueue xhqueue;

typedef

struct xhqueue* xhqueue_t;

xhqueue_t queue_init(xhqueue_t que,int n);

bool queue_isempty(const xhqueue_t que);

bool queue_isfull(const xhqueue_t);

void* queue_front(const xhqueue_t que);

bool queue_dequeue(xhqueue_t que, operate op, void** data);

bool queue_enqueue(xhqueue_t que,void* data);

bool queue_deleteall(xhqueue_t que,operate op, void** data);

int queue_getcapacity(xhqueue_t que);

int queue_getlen(xhqueue_t que);

node_t que_nodeporevious(xhqueue_t que,node_t nd);

#endif

功能從函式名稱可以看出,還有具體的細節和前面幾篇文章其實是相同的,所以直接上實現

#include

"tongyongxunhuanlianshi.h"

struct node

;/**發現還是要帶頭尾部節點比較好*/

struct xhqueue

;xhqueue_t queue_init(xhqueue_t que,int n)

que->front->next = que->tail;

que->tail->next = que->front;

que->front->

data

=null;

que->tail->

data

=null;

que->len =

0 ; return que;

}bool queue_isempty(const xhqueue_t que)

bool queue_isfull(const xhqueue_t que)

return

false;

}void

* queue_front(const xhqueue_t que)

bool queue_dequeue(xhqueue_t que, operate op, void

**data)

free(tmp);

tmp =

null;

que->len--;

return

true;

}bool queue_enqueue(xhqueue_t que,void

*data)

else

}node_t que_nodeporevious(xhqueue_t que,node_t nd)

if(head->next != que->front) return

null;

}bool queue_deleteall(xhqueue_t que,operate op, void

**data)

if(op!=

null

&&data

!=null)

free(que->tail);

free(que->front);

free(que);

que=

null;

return

true;

}int queue_getcapacity(xhqueue_t que)

int queue_getlen(xhqueue_t que)

至此就完成兩種方式的實現了!(線性資料結構終於看完了^_^)

佇列 迴圈佇列的實現

為了可以重新利用佇列底層陣列中已刪除元素所佔的空間,消除可能出現的 假滿 現象,將順序佇列改進為迴圈佇列。迴圈佇列是首尾相連的佇列 當front rear變數達到底層陣列的capacity 1之後,再向前以為就變成0.入隊 1 判斷佇列是否已滿,已滿丟擲越界異常 2 不滿的話把元素查到隊尾,並且re...

通用佇列類的實現

嗯。這些題目應該是差不多的吧,感覺這個要比我之前寫的那個鍊錶簡單的多,題目如下 1 根據資料結構和類模板知識,定義乙個通用佇列 先進先出 類並加以實現,編寫主函式進行測試 好吧 相當於沒說 但作為輕度強迫症患者,我當然要寫出來乙個至少實現以下功能的佇列 1,使用類模板和函式模板,實現可以儲存各種型別...

迴圈佇列的實現

佇列是一種先進先出的線性表,具有線性表的特性 分為鏈式佇列與順序佇列 順序佇列 用一段位址連續的儲存單元儲存資料元素,定義兩個游標 指向隊頭 的游標 front 指向隊尾的游標 rear 如果front rear隊列為空,如果 rear 1 maxsize front佇列滿 此為迴圈佇列 如普通佇列...