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