資料結構(C實現)------- 順序隊列(迴圈隊列之計數器實現)

來源:互聯網
上載者:User

標籤:順序隊列迴圈隊列   迴圈隊列的順序實現   

        為了能充分的利用空間,解決順序隊列的“假溢出”問題,可以採用兩種方法:一種是將資料向前移動,讓空的儲存單元留在隊尾;另一種是將順序隊列構造成一個環狀的空間,即將隊列的資料區data[0....MAXSIZE-1]看成頭尾相接的迴圈結構,使得data[0]接在data[MAXSIZE-1]之後,這就是迴圈隊列。

        這節就來實現迴圈順序隊列。

       

        迴圈隊列中的閒置空間可以被利用,除非數組空間真的被隊列元素全部佔用,否則不會上溢。因此,隊一此簡單的應用外,真正實用的順序隊列是迴圈隊列。

        入隊時,隊尾指標向前追趕隊頭指標;出隊時,隊頭指標向前追趕隊尾指標。因此隊空和隊滿指標均等於隊尾指標,無法通過Q->front == Q->rear來判斷順序隊列是空還是滿。
        為瞭解決這個問題,有3種方法,其一是設一個標識位,以區別順序隊列是空還是滿;其二是使用一個計數器記錄隊列中元素的總數;其三是少用一個元素空間,約定入隊前測試隊尾指標在迴圈意義下加1是否等於隊頭指標,若相等,則認為是隊滿(註:rear所指的單元始終為空白)。  

        這節,就先採用第二種方法,設一個計數器記錄隊列中元素的總數,用於判斷隊列空還是隊列滿。

順序隊列(迴圈隊列)類型描述:
//順序隊列的類型描述(設立計數器)#define MAXSIZE 100typedef int ElemType;typedef struct{ElemType *data;int front,rear,count;}SqQueue;
基本操作:

         1. 初始化順序隊列(迴圈隊列) Init_SqQueue(SqQueue* Q)

//初始化順序隊列void Init_SqQueue(SqQueue* Q){    Q->data = (SqQueue*)malloc(sizeof(SqQueue) * MAXSIZE);Q->front = Q->rear = Q->count = 0;}

        2. 銷毀順序隊列(迴圈隊列)Destroy_SqQueue(SqQueue* Q)

//銷毀順序隊列void Destroy_SqQueue(SqQueue* Q){if(Q->data){free(Q->data);Q->front = Q->rear = Q->count = 0;}} 

       3. 清空順序隊列(迴圈隊列)Clear_SqQueue(SqQueue* Q)

//清空順序隊列void Clear_SqQueue(SqQueue* Q){Q->front = Q->rear = Q->count = 0;}

      4. 判斷順序隊列(迴圈隊列)是否為空白IsEmpty_SqQueue(SqQueue* Q)

//判斷順序隊列是否為空白int IsEmpty_SqQueue(SqQueue* Q){return (Q->count == 0);}

       5. 判斷順序隊列(迴圈隊列)是否已滿 iSFull_SqQueue(SqQueue* Q)

//判斷順序隊列是否已滿int iSFull_SqQueue(SqQueue* Q){return (Q->count == MAXSIZE);}


      6. 求得順序隊列(迴圈隊列)的長度GetLength_SqQueue(SqQueue* Q)

//求得順序隊列的長度int GetLength_SqQueue(SqQueue* Q){return Q->count;}

      7. 取得順序隊列(迴圈隊列)的的隊頭GetHead_SqQueue(SqQueue* Q,ElemType *x)

//取得順序隊列的的隊頭void GetHead_SqQueue(SqQueue* Q,ElemType *x){if(IsEmpty_SqQueue(Q)){printf("順序隊列空!\n");exit(0);}else{*x = Q->data[Q->front];}}

     8. 取得順序隊列(迴圈隊列)的的隊尾GetRear_SqQueue(SqQueue* Q,ElemType *x)

//取得順序隊列的的隊尾void GetRear_SqQueue(SqQueue* Q,ElemType *x){if(IsEmpty_SqQueue(Q)){printf("順序隊列空!\n");exit(0);}else{*x = Q->data[Q->rear - 1];}}

      9. 入順序隊列(迴圈隊列)En_SqQueue(SqQueue* Q,ElemType x)

//入順序隊列void En_SqQueue(SqQueue* Q,ElemType x){if(iSFull_SqQueue(Q)){printf("順序隊列已滿!\n");exit(0);}else{Q->data[Q->rear] = x;Q->rear = (Q->rear + 1) % MAXSIZE;Q->count++;}}

      10. 出順序隊列(迴圈隊列)De_SqQueue(SqQueue* Q,ElemType *x)

//出順序隊列void De_SqQueue(SqQueue* Q,ElemType *x){if(IsEmpty_SqQueue(Q)){printf("順序隊列空!\n");exit(0);}else{*x = Q->data[Q->front];Q->front = (Q->front + 1) % MAXSIZE;Q->count--;}}

       11. 列印順序隊列(迴圈隊列)Print_SqQueue(SqQueue* Q)

//列印順序隊列void Print_SqQueue(SqQueue* Q){int i = 0;int j = Q->front;if(IsEmpty_SqQueue(Q)){printf("順序隊列空!\n");exit(0);}else{while(i < Q->count){printf("%d\t",Q->data[j]);j = (j + 1) % MAXSIZE;i++;}printf("\n");}}


     以上,就是附設一個計數器指標來實現迴圈順序隊列。






 




 

       

 



 

資料結構(C實現)------- 順序隊列(迴圈隊列之計數器實現)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.