c语言 队列的运用
隊列最主要的作用啊是用來管理數(shù)據(jù)流的,防止數(shù)據(jù)因為傳輸頻率過快得不到及時處理而丟失。
隊列的原理就是先進先出,類似于管道
循環(huán)隊列的引用 正常的隊列出隊和入隊都是通過隊首和隊尾指針的移位來實現(xiàn)的 如果用正常的順序隊列的話 buff也會根據(jù)首尾指針的移位而一直增加其分配的數(shù)據(jù)存儲空間,為解決這一問題我們引用了循環(huán)隊列??
跟著程序進行邏輯講解?
queue.h中定義隊列結(jié)構(gòu)體
typedef struct ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//隊列的結(jié)構(gòu)定義
{
? ? int *base ;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?隊列緩存指針
? ? int front ;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 首地址指針
? ? int rear ;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?尾地址指針
} SqQueue ;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
#define MAXIZE 11 ? ? ? ? ? ? ? ? ? ? ? ? ? ? //隊列長度? 跟初始化分配的內(nèi)存空間
初始化隊列?
void InitQueue( SqQueue *Q ) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
{
? ? Q->base = ( int* )malloc( sizeof( int ) * MAXIZE ) ; ? ? ??
? ? Q->front = Q->rear = 0 ;
}? ? ?C 庫函數(shù)?void *malloc(size_t size)?分配所需的內(nèi)存空間,并返回一個指向它的指針。
首尾地址指向0
入隊
void EnQueue( SqQueue *Q , int val ) ? ? ? ? ? ? ? ? ? ?
{
? ? if( ( Q->rear + 1 ) % MAXIZE == Q->front ) ?DeQueue(Q); ? ? ? ? ? ? ? //用來保證隊列滿的時候,數(shù)組仍留出一個空閑空間 ?判斷隊滿后出隊一個 然后再讓數(shù)據(jù)入隊
? ? ? ? Q->base[ Q->rear ] = val ;
? ? ? ? Q->rear = ( Q->rear +1 ) % MAXIZE ;
}? ?( Q->rear +1 ) % MAXIZ(加一% MAXIZE 求余的含義就是讓指針在0到MAXIZE循環(huán))
出隊
void DeQueue( SqQueue *Q ?) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//出隊 ? ? ? ??
{
? ? if( Q->front == Q->rear ) ?return; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //隊中沒有數(shù)據(jù)
? ? else Q->front = ( Q->front + 1 ) % MAXIZE ;
}? ?同上一樣
運用小技巧就是我們可以直接用(Q.base[Q.rear])-(Q.base[Q.front])首尾指針來獲取我們當(dāng)前的起始隊列數(shù)據(jù)? 進行運算? 或者可以通過指針(+-)來獲取當(dāng)前隊列任何一處的數(shù)據(jù)
總結(jié)
- 上一篇: ps如何去掉元数据
- 下一篇: 解决vscode中文乱码的问题