通用迴圈佇列,這兒是我的筆記,希望大家可以友好交流!!謝謝#__#
有好幾天沒寫了,一直和朋友玩,都沒空看了。
今天得空寫了一下佇列的實現,還是和之前一樣,有鍊錶的方式和陣列的方式兩種。
先是陣列的形式吧,佇列結構:
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佇列滿 此為迴圈佇列 如普通佇列...