【數據結構之旅】循環隊列

說明:

    時間關係,這裏只給出代碼及註釋,有空的時候再詳細介紹一下代碼的實現流程。




1.代碼及註釋

    如下:

#include<stdio.h>
#include<stdlib.h>

typedef char ElemType;
typedef struct {
   ElemType  *elem;  // 存儲空間的基址
   int front;        // 隊頭位標
   int rear;         // 隊尾位標,指示隊尾元素的下一位置
   int maxSize;      // 最大長度
} SqQueue;


#define OVERFLOW -1
#define OK 1
#define ERROR 0    
#define TRUE 2
#define FALSE -2

typedef int Status;

Status InitQueue_Sq(SqQueue &Q, int size) { // 構造一個空隊列
   Q.elem = (ElemType *)malloc(size*sizeof(ElemType));
   Q.maxSize = size;
   Q.front = Q.rear = 0;
   return OK;
} 


Status QueueEmpty_Sq(SqQueue Q){ // 判斷隊列Q是否空,若空則返回TRUE,否則FALSE
   if(Q.front == Q.rear)
      return TRUE;
   else  
      return FALSE; 
}

Status EnQueue_Sq(SqQueue &Q, ElemType e) {
        // 若當前隊列不滿,在隊列的尾元素之後,插入元素 e 爲新的隊列尾元素

   if(Q.front == (Q.rear + 1)%Q.maxSize)
       return ERROR;

   Q.elem[Q.rear] = e;
   Q.rear = (Q.rear + 1)%Q.maxSize;
   return OK;
}


Status DeQueue_Sq(SqQueue &Q, ElemType &e) {
        // 若隊列不空,則刪除隊列Q中的頭元素,用 e 返回其值
   if(Q.front == Q.rear)
      return ERROR; // 隊空報錯
   e = Q.elem[Q.front];
   Q.front = (Q.front+1)%Q.maxSize; // Q.front循環加1
   return OK;
}

int main(void) {    
    SqQueue Q;
    ElemType e;
    Status result1, result2;
    
    //1. 初始化一個size爲5的循環隊列Q
    InitQueue_Sq(Q, 5);
    EnQueue_Sq(Q, 'A'); 
    EnQueue_Sq(Q, 'B'); 
    EnQueue_Sq(Q, 'C');    
    EnQueue_Sq(Q, 'D');
    DeQueue_Sq(Q, e);   
    EnQueue_Sq(Q, 'E');  
    DeQueue_Sq(Q, e);   
    EnQueue_Sq(Q, 'F');   //出現了要用求餘確定來確定新進隊列的元素位置,
                          //即“循環使用空間的情況”   
    result1 = EnQueue_Sq(Q, 'G');   //滿了,放不下
   
    printf("result1 = %d\n", result1);
                                               
    DeQueue_Sq(Q, e);   
    DeQueue_Sq(Q, e);   
    DeQueue_Sq(Q, e);   
    DeQueue_Sq(Q, e);   
    result2 = DeQueue_Sq(Q, e);   //空了,return FALSE      
      
    printf("result2 = %d\n", result2);
                                          
    
}




2.執行結果

    如下:

result1 = 0
result2 = 0
請按任意鍵繼續. . .




3.研究方法

    第2步只是直接給出結果,實際上利用編譯器的斷點功能可以觀察每一步的執行情況,從而加深對循環隊列的理解,可以嘗試一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章