環形佇列的建立以及一些基本的操作
阿新 • • 發佈:2019-01-13
我們的環形佇列長什麼樣子的尼,那幾句話也描述不出來概括不了他的樣子,還是拿一張圖看一下吧
- 在沒有插入資料時候他也就是長這個樣子了,首位隊外首位指標相交,都在這個初始佇列塊子的位置。
- 唯一需要注意的一點是我們這裡定義的這個環形佇列的==頭
==只放了一個指標,我們資料的。 - 我們的隊外尾指標位置是隨這個插入資料移動的,始終指向最後一個數據快的位置。
- 插入資料移動一下吧,這樣應該思路就比較清晰了。
-
出佇列時候佇列外頭指標還是在最前面一個數據位置前一個位置。
-
當我們這個環形佇列圈子打滿以後,首位相接但是陣列沒有滿,還是方便繼續插入的。
-
好了!主要還是圖,我們根據圖需定義圖上的兩個隊外移動指標,那麼我們就要對佇列裡面的資料進行二次封裝了,就是需要在定義一個結構體,是佇列在這個首位指標內部移動過來移動過去。
-
來看一下程式碼吧
定義一個環形佇列的標頭檔案
#pragma once typedef int QDataType; typedef struct ListNode { struct ListNode* _pNext; QDataType _data; }ListNode, *PListNode; typedef struct Queue { PListNode _pHead; PListNode _pTail; }Queue; void QueueInit(Queue* q); void QueuePush(Queue* q, QDataType data); void QueuePop(Queue* q); int QueueSize(Queue* q); int QueueEmpty(Queue* q); QDataType QueueFront(Queue* q); QDataType QueueBack(Queue* q); void QueueDestroy(Queue* q); //////////////////////////////////////////// // void TestQueue();
原始檔完善函式介面
#include "Queue.h" #include <malloc.h> #include <assert.h> #include <stdio.h> PListNode BuyListNode(QDataType data) { PListNode pNewNode = (PListNode)malloc(sizeof(ListNode)); if(NULL == pNewNode) { assert(0); return NULL; } pNewNode->_data = data; pNewNode->_pNext = NULL; return pNewNode; } void QueueInit(Queue* q) { assert(q); q->_pHead = q->_pTail = BuyListNode(0); } void QueuePush(Queue* q, QDataType data) { assert(q); q->_pTail->_pNext= BuyListNode(data); q->_pTail = q->_pTail->_pNext; } void QueuePop(Queue* q) { PListNode pDelNode = NULL; assert(q); pDelNode = q->_pHead->_pNext; if(pDelNode) { if(NULL == pDelNode->_pNext) q->_pTail = q->_pHead; q->_pHead->_pNext = pDelNode->_pNext; free(pDelNode); } } int QueueSize(Queue* q) { PListNode pCur; int count = 0; assert(q); pCur = q->_pHead->_pNext; while(pCur) { count++; pCur = pCur->_pNext; } return count; } int QueueEmpty(Queue* q) { return NULL == q->_pHead->_pNext; } QDataType QueueFront(Queue* q) { return q->_pHead->_pNext->_data; } QDataType QueueBack(Queue* q) { return q->_pTail->_data; } void QueueDestroy(Queue* q) { } void TestQueue() { Queue q; QueueInit(&q); QueuePush(&q, 1); QueuePush(&q, 2); QueuePush(&q, 3); QueuePush(&q, 4); printf("front = %d\n", QueueFront(&q)); printf("back = %d\n", QueueBack(&q)); printf("back = %d\n", QueueSize(&q)); QueuePop(&q); QueuePop(&q); printf("front = %d\n", QueueFront(&q)); printf("back = %d\n", QueueBack(&q)); printf("back = %d\n", QueueSize(&q)); }