c語言資料結構實現 陣列佇列 環形佇列

2021-07-25 10:09:30 字數 2088 閱讀 1835

應用場景是乙個生產者乙個消費者,兩者平均處理速度是相當的,但是有生產峰值速度太快,消費者處理速度跟不上的情況;

這種場景若用單執行緒處理,則會出現消費速度慢導致拖慢生產者的速度;

若使用雙線程處理,乙個生產線程乙個消費執行緒,這個時候就能用到佇列/環形佇列了。

佇列的資料結構其實非常簡單,實現方式主要為動態的鏈式結構或者為靜態的陣列結構,本文介紹一種靜態的陣列結構;

如上圖所示,入列時插入佇列尾,出列時由佇列頭彈出,用下標值進行位置標識。

約束是使用者資料必須是定長的資料,才能用靜態陣列結構去標識。

建立佇列,需要確定佇列大小以及每個使用者資料的長度

int bufqueue_create(bufqueue_t *phead, size_t nmemb, size_t item_size)

#define __ispower(_num_) ((_num_ ^ (_num_ - 1)) == (((_num_ - 1) << 1) + 1))

if ( !__ispower(nmemb) )

/* refree queue */

free_pointer(phead->queue);

phead->queue = (bufqueue_item *)calloc(nmemb, sizeof(bufqueue_item));

if ( !phead->queue )

for ( ix = 0; ix < nmemb; ix++ )

}phead->item_size = item_size;

phead->size = nmemb;

phead->mask = nmemb - 1;

phead->head = 0;

phead->tail = 0;

phead->used = 0;

printf("queue alloc success, size: %zd ( bytes )\n",

sizeof(bufqueue_t) + nmemb * item_size);

return success;

}

入列操作,分為獲取佇列尾,返回資料的指標給生成者,生產者生產資料後,更新佇列尾操作

void* bufqueue_tail(bufqueue_t *phead)

return (phead->queue[phead->tail].pitem);

}

int bufqueue_push(bufqueue_t *phead)

出列,消費者呼叫該介面直接獲取到資料指標,注意外部並不需要釋放空間

void* bufqueue_pop(bufqueue_t *phead)

pitem = phead->queue[phead->head].pitem;

phead->head = (phead->head + 1) & phead->mask;

phead->used--;

return (pitem);

}

判定佇列是否為空

int bufqueue_isempty(bufqueue_t *phead)

return failure;

}

判斷佇列是否滿

int bufqueue_isfull(bufqueue_t *phead)

if ( phead->head == ((phead->tail + 1) & phead->mask) )

return failure;

}

使用陣列佇列類似於犧牲空間換時間的方法,實現簡單。但要求使用者資料必須定長,並且會出現佇列滿的情況;

但是在索引方面,由於使用了下標法進行定位,可以快速地查詢到下乙個元素(head=(head + 1)&mask),這個時候也必須保證佇列大小為2^n;

同時在乙個生產者乙個消費者的場景下,使用該佇列可以無需上鎖,節省鎖的開銷;

資料結構 陣列佇列

佇列的實現還是依託於一開始所寫的陣列 資料結構 二次封裝自己的陣列 一 完成陣列基本功能 資料結構 二次封裝自己的陣列 二 公升級為泛型陣列 資料結構 二次封裝自己的陣列 三 公升級為動態陣列 下面是佇列的實現 class arrayqueue queue public arrayqueue pub...

資料結構 陣列佇列 迴圈佇列

佇列 是 先進先出 的資料結構,從隊尾入隊,從隊頭出隊。佇列中使用的array,參考 資料結構 手寫動態陣列 public inte ce queue public class arrayqueue implements queue public arrayqueue int capacity ov...

資料結構之陣列佇列

佇列的特性 1.佇列是一種線性資料結構,與陣列相比,佇列的方法是陣列的子集 2.向佇列中新增元素只能在隊尾進行,在隊首刪除元素 3.佇列是一種先進先出的資料結構 佇列的方法 1.void enqueue e e 向佇列中新增元素 2.e dequeue 從佇列中刪除元素 3.int getsize ...