隊列的特點:
先進先出,隊列是一種操作受限的線性表,其限制條件為允許在表的一端進行插入,而在表的另一端進行刪除。插入的一端叫做隊尾,刪除的一端叫做隊頭。向隊列中插入新元素的行為稱為進隊,從隊列中刪除元素的行為稱為出隊。一般用法在隊頭插入,在隊尾刪除。
隊列終究它就是個buf,buf就是存東西的,保存不丟失,可以理解為在buf上封裝了一些操作。
隊列的用處:
1、用于任務間通信,尤其對于單任務系統,多個任務都操作一個隊列,比如,A任務往隊列里扔數據,B任務負責檢查隊列,只要有數據就進行處理,起到了兩個任務通信的效果,同樣可以把這個數據理解為消息,A任務給B任務發消息,B任務根據不同的消息(數據)做不同的處理。
2、緩沖數據。最常見的就是串口接收數據,搞一個環形buf隊列,收到數據就放到這個隊列中,當然這個buf肯定是有長度的,不能一直存儲數據。正常用法下,得及時讀取走,這樣就能一直接收數據不丟失。
隊列的幾個基本的使用包括:
- 隊列的創建;
- 隊列的添加元素,刪除元素,提取元素等對隊列的操作;
隊列的創建:首先定義一個隊列的大小,這里直接定義為int型數組,最大存儲6個元素。定義一個結構體存放隊列的信息,包括數組的指針,用于后續對數組的操作,定義好結構體后對結構體進行初始化
int queuebuffer[6]={0};typedef struct _Tag_My_Queue_{ int *buffer; unsigned char In; unsigned char Out; int queueSize;}my_queue;void queueInit(my_queue *queue,int *buffer,int bufferSize){ queue->buffer = buffer; queue->In = 0; queue->Out = 0; queue->queueSize = bufferSize;}
隊列空間 與隊列數據數量的函數如下:
int queue_space(my_queue *queue){ int size =queue->queueSize; int num = queue->Out; while(num != queue->In) { size--; num = (num + 1)%queue->queueSize; } return size - 1;}//queue data numbersint queue_deep(my_queue *queue){ int size = 0; int num = queue->Out; while(num != queue->In) { size++; num = (num + 1)%queue->queueSize; } return size;}
如果要對隊列增加和刪除元素要進行隊列的相關操作。定義函數如下:
int addDataToQueue(my_queue *queue,int data){ if(queue_full(queue)) { printf("queue already full!!!\n"); return 0; } queue->buffer[queue->In] = data; queue->In = (queue->In + 1) % queue->queueSize; return 1;}int deleteDataFromQueue(my_queue *queue,int *data){ if(queue_empty(queue)) { printf("queue already empty!!!\n"); return 0; } *data = queue->buffer[queue->Out]; queue->Out = (queue->Out + 1) % queue->queueSize; return 1;}
隊列生成后要進行隊列的元素判斷,隊列是否為空,或者是否隊列已滿,定義函數如下:
int addDataToQueue(my_queue *queue,int data){ if(queue_full(queue)) { printf("queue already full!!!\n"); return 0; } queue->buffer[queue->In] = data; queue->In = (queue->In + 1) % queue->queueSize; return 1;}int deleteDataFromQueue(my_queue *queue,int *data){ if(queue_empty(queue)) { printf("queue already empty!!!\n"); return 0; } *data = queue->buffer[queue->Out]; queue->Out = (queue->Out + 1) % queue->queueSize; return 1;}
下面就對隊列 的數據進行相關的操作,包括增加數據入隊列,數據出隊列等相關的操做,運行函數觀察運行起來的狀態。
void main(){ my_queue testqueue; int data; queueInit(&testqueue,queuebuffer,sizeof(queuebuffer)/sizeof(queuebuffer[0])); addDataToQueue(&testqueue,55); addDataToQueue(&testqueue,3); addDataToQueue(&testqueue,2); addDataToQueue(&testqueue,33); addDataToQueue(&testqueue,6);printf("queue data is %d\r\n",queue_print(&testqueue)); printf("---queue deep:%d\n",queue_deep(&testqueue)); printf("---queue space:%d\n",queue_space(&testqueue)); deleteDataFromQueue(&testqueue,&data); printf("data:%d\n",data); deleteDataFromQueue(&testqueue,&data); printf("data:%d\n",data); deleteDataFromQueue(&testqueue,&data); printf("data:%d\n",data); deleteDataFromQueue(&testqueue,&data); printf("data:%d\n",data); printf("---queue deep:%d\n",queue_deep(&testqueue)); printf("---queue space:%d\n",queue_space(&testqueue)); deleteDataFromQueue(&testqueue,&data); printf("data:%d\n",data); addDataToQueue(&testqueue,45); addDataToQueue(&testqueue,22); addDataToQueue(&testqueue,33); deleteDataFromQueue(&testqueue,&data); printf("data:%d\n",data); printf("data:%d\n",deleteDataFromQueue(&testqueue,&data)); printf("---queue deep:%d\n",queue_deep(&testqueue)); printf("---queue space:%d\n",queue_space(&testqueue)); queue_print(&testqueue); printf("In:%d,Out:%d\n",testqueue.In,testqueue.Out);while(1);}
運行結果如下圖所示:
運行結果
-
數據
+關注
關注
8文章
7134瀏覽量
89392 -
函數
+關注
關注
3文章
4345瀏覽量
62875 -
隊列
+關注
關注
1文章
46瀏覽量
10923
發布評論請先 登錄
相關推薦
評論