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