資料結構::隊列::迴圈隊列

來源:互聯網
上載者:User

今天說說隊列。

認識隊列這東西很久了,但一直都沒有用到。就知道是基本的資料結構。在百度和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;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.