循環隊列

nc6433 9年前發布 | 2K 次閱讀 C/C++ 數據結構

線性結構的不多說,是一種操作受限制的線性結構,推薦隊列對比起棧學習會更簡單,也就是和棧差不多,多了而一個指針,棧是由一個頭指針就ok了,隊列多一個尾指針,因為棧是先進后出,隊列是先進先出;比如排隊買票排在前面的先買到票;

剛開始先看普通隊列,


不斷的入隊,rear往上移動,出隊front往上移動,這個隊列的實際有效區域在兩個指針之間,于是隨front往上移動的過程中front以下的空間就不能利用了,這種就叫什么內存泄露(好像是這么說的);

要解決這個問題就要把普通隊列改為循環隊列,下面就以循環隊列寫代碼;

在循環隊列中難理解的就是判斷隊空隊滿,在用循環隊列的時候我們將要空出一個內存單元不用(作用見下面);

Q.front==Q.rear就為隊空,

(Q.front+1)%MAXSIZE==Q.rear就為隊滿,(MAXSIZE為隊列最大容量);這里就是說為什么循環隊列要空一個空間的原因了;還有就是(Q.front+1)%MAXSIZE這里用到了取膜的方法;

下面寫的循環隊列:

    #include<stdio.h>  
    #define M 1000  
    typedef struct quene  
    {  
        int *a;  
        int top;  
        int Tail;  
    }*Quene;  
    void Initialization(Quene);  
    void Add(Quene,int);  
    int * Out(Quene);  
    void PutAll(Quene);  
    bool Full(Quene);  
    bool Empty(Quene);  

    int main()  
    {  
        Quene p=new struct quene;  
        Initialization(p);  
        Add(p,2);  
        Add(p,3);  
        Add(p,4);  
        Add(p,5);  
        Out(p);  
        PutAll(p);  
        return 0;  
    }  
    void Initialization(Quene p)  
    {  
        p->a=new int[M];  
        p->top=p->Tail=0;  
    }  
    bool Full(Quene p)  
    {  
        if((p->Tail+1)%M==p->top)  
            return true;  
        return false;  
    }  
    bool Empty(Quene p)  
    {  
        if(p->top==p->Tail)  
            return true;  
        return false;  
    }  
    void Add(Quene p,int e)  
    {  
        if(Full(p))  
            return;  
        p->a[p->Tail]=e;  
        p->Tail=(p->Tail+1)%M;  
    }  
    int * Out(Quene p)  
    {  
        if(Empty(p))  
            return NULL;  
        int w;  
        w=p->a[p->top];  
        p->top=(p->top+1)%M;  
        return &w;  
    }  
    void PutAll(Quene p)  
    {  
        while(p->top!=p->Tail)  
        {  
            printf("%d ",p->a[p->top]);  
            p->top=(p->top+1)%M;  
        }  
        printf("\n");  
    }  

寫的很簡單,看懂了自己就可以多寫一些功能了,都是以int型作為基本的數據單元,在實際應用中碰到的很多都是結構體,或者是面向對象的類;

 本文由用戶 nc6433 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!