循環隊列
線性結構的不多說,是一種操作受限制的線性結構,推薦隊列對比起棧學習會更簡單,也就是和棧差不多,多了而一個指針,棧是由一個頭指針就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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!