今天說說隊列。
認識隊列這東西很久了,但一直都沒有用到。就知道是基本的資料結構。在百度和google和一段時間思考後,我選用了迴圈隊列。
從百度可以得知:
將向量空間想象為一個首尾相接的圓環,並稱這種向量為迴圈向量。儲存在其中的隊列稱為迴圈隊列(Circular Queue)。大概就像這幅圖那樣。
聲明頭和尾變數,如果是入隊就尾+1,出隊頭+1。因為迴圈隊列中,由於入隊時尾指標向前追趕頭指標;出隊時頭指標向前追趕尾指標,造成隊空和隊滿時頭尾指標均相等。因此,無法通過條件front==rear來判別隊列是"空"還是"滿"。通常我都會設個count變數,計算隊列是空還是滿。
迴圈隊列關鍵就是對動態記憶體分配的認識。
常用結構如下:
typedef struct //迴圈列表結構{ int *base; int front; int rear;}SqQueue;
常用函數如下:
int count = 0;//構造一個空隊列int initQueue(SqQueue *Q) {Q->base = (int *) malloc(MAXSIZE * sizeof(int));if (!Q->base) {MsgS("malloc wrong!\n");return -1;}Q->front = Q->rear = 0;MsgS("initQueue ok!\n");return 0;}//判斷隊列是否為空白int isEmpty(SqQueue *Q) {if (count == 0 && Q->front == Q->rear)return 1;elsereturn 0;}//判斷隊列是否為滿int isFull(SqQueue *Q) {if (count == 50 && Q->front == (Q->rear + 1) % MAXSIZE)return 1;elsereturn 0;}//插入元素e為Q的新隊尾元素int enQueue(SqQueue *Q, Frame e) {if (isFull(Q)) {MsgS("Queue is full!\n");usleep(10*1000);}Q->base[Q->rear] = e;Q->rear = (Q->rear + 1) % MAXSIZE;MsgS("enQueue ok!\n");count++;return 0;}//刪除Q的隊頭元素,用e返回其值int deQueue(SqQueue *Q,Frame *e) {*e = Q->base[Q->front];Q->front = (Q->front + 1) % MAXSIZE;MsgS("deQueue ok!\n");count--;return 0;}