迴圈佇列就是當資料寫到結尾後,在回到開頭接著寫,該過程類似迴圈鍊錶。如何實現這個到結尾後又轉到開頭呢?
很簡單,取模操作!
上兩個圖是迴圈佇列的兩種狀態,以下所寫的所有函式都可以對照著這兩幅圖來看。
**如下:
filename: buffer.h
#ifndef __buffer_h__
#define __buffer_h__
#include #include #define buff_size (1920*1080*3*5+1)
typedef unsigned char uint8;
typedef unsigned int uint32;
typedef struct
buffer;
//buffer清零初始化
void buff_init(buffer * buff);
//buffer填充元素個數
unsigned int buff_occupancy(const buffer * buff);
//buffer剩餘空間
unsigned int buff_remain(const buffer * buff);
//buffer是否滿了
bool buff_isfull(const buffer * buff);
//buffer是否為空
bool buff_isempty(const buffer * buff);
//向buffer中新增資料data, 長度為len, 成功返回true, 失敗返回false
bool buff_pushdata(buffer * buff, const uint8 * data, uint32 len);
//把p放到buffer中
bool buff_push(buffer * buff, const uint8 *p);
//從buffer中取出len長度的資料賦值給data,成功返回ture,失敗返回false
bool buff_readdata(buffer * buff, uint8 * data, unsigned int len);
bool buff_readdata1(buffer * buff, unsigned int len);
//將buffer第乙個元素取出
bool buff_read(buffer * buff, uint8 * p);
//列印buffer中的資料
unsigned int buff_printf(const buffer * buff);
#endif
filename: buffer.cpp
//迴圈緩衝區**
#include "buffer.h"
//buffer清零初始化
void buff_init(buffer * buff)
//buffer填充元素個數
unsigned int buff_occupancy(const buffer * buff)
//buffer剩餘空間
unsigned int buff_remain(const buffer * buff)
//buffer是否滿了
bool buff_isfull(const buffer * buff)
//buffer是否為空
bool buff_isempty(const buffer * buff)
//向buffer中新增資料data, 長度為len, 成功返回true, 失敗返回false
bool buff_pushdata(buffer * buff, const uint8 * data, uint32 len)
uint32 i = 0;
//memcpy(buff->writep, data, len);
for(i=0;iwritep)=data[i];
buff->writep = buff->data + ((buff->writep - buff->data + 1)%buff_size);
}return true;
}//把p放到buffer中,純抄襲,不明白什麼情況!
bool buff_push(buffer * buff, const uint8 *p)
//從buffer中取出len長度的資料賦值給data,成功返回ture,失敗返回false
bool buff_readdata(buffer * buff, uint8 * data, unsigned int len)
return true;
}//將cbuffer第乙個元素取出
bool buff_read(buffer * buff, uint8 * p)
//列印cbuffer中的資料
unsigned int buff_printf(const buffer * buff)
return buff_occupancy(buff);
}
實現迴圈佇列
利用陣列實現迴圈佇列,head tail並不能判斷佇列空與滿,需要另外加上乙個輔助 include include includeusing namespace std typedef struct node node define len 20 typedef int elemtype class...
迴圈佇列實現
假設是長度為5的陣列,初始狀態,空佇列如所示,front與 rear指標均指向下標為0的位置。然後入隊a1 a2 a3 a4,front指標依然指向下標為0位置,而rear指標指向下標為4的位置。出隊a1 a2,則front指標指向下標為2的位置,rear不變,如下圖所示,再入隊a5,此時front...
迴圈佇列實現
假設有n個資料採集執行緒負責採集資料,有1個入庫執行緒負責往資料庫寫資料,由於採集執行緒和入庫執行緒是非同步的,所以中間需要乙個快取區來作為採集執行緒和入庫執行緒之間通訊的橋梁,所以引入了迴圈佇列。假設有n個採集執行緒,1個入庫執行緒,架構圖如下 注意 1 由於採集執行緒入隊時,操作的是隊尾,有n個...