隊列 的定義:
一種可以是實現“先進先出”的存儲結構。數據的進出類似于排隊購票。隊只允許隊尾一端(rear)添加,在另一端隊頭(front)刪除。隊有隊頭(front)和隊尾(rear)兩個指針。隊頭front指向第一個元素,隊尾rear指向無實際意義的元素,即隊列最后一個元素的下一位置。
//隊列定義
typedef struct Queue
{
int *pBase;//數組基地址,數組的首地址
int front;//隊頭
int rear;//隊尾巴
}QUEUE;
//創建一個隊列,空間分配,保存6個整形元素。
void init (QUEUE *pQ)
{
pQ->pBase=(int*)malloc(sizeof(int)*6);//長度為6的數組
pQ->front=0;
pQ->rear=0;
}
隊列的分類:
分為動態隊列和靜態隊列兩種。動態隊列用鏈表實現。動態隊列易于實現。靜態隊列用數組實現,靜態隊列通常都必須是循環隊列。
靜態隊列為甚么必須是循環隊列?
數組實現靜態隊列,刪除元素時候,每刪除一位,front指針上移一位,浪費一個單位的數組空間。這種方式添加元素的時候rear上移一個,刪除元素的時候front上移一個。總之都是上移。
當front或者rear指到最上面一個位置,再上移就移動到最下面一個位置。所以數組實現隊列的時候必須是循環隊列,傳統方式實現不了。
2.循環隊列需要幾個參數來確定,及循環隊列各個參數的含義
隊列需要兩個參數確定,front和rear.2個參數不同的場合有不同的含義,建議初學者先記住,然后慢慢體會。
隊列初始化
Front和rear的值都是零
隊列非空
Front 代表的是隊列的第一個元素
Rear代表隊列的最后一個有效元素的下一個元素
隊列空
Front 和rear的值相等,但不一定是零。
2.循環隊列入隊偽算法講解
Rear=(rear+1)%數組的長度
//進隊,隊尾rear+1;
bool en_queue(QUEUE *pQ,int val)
{
if(full_queue(pQ))
{
return false;
}
else
{
pQ->pBase[pQ->rear]=val;
pQ->rear=(pQ->rear+1)%6;
}
}
循環隊列出隊偽算法講解
Front=(front+1)%數組的長度
//出隊,隊頭位置變為:(front+1)%6
bool out_queue(QUEUE *pQ,int *pVal)
{
if(emput_queue(pQ))
return false;
else
{ ??*pVal=pQ->pBase[pQ->front];
pQ->front=pQ->front+1;
return true;
}
}
4.判斷循環隊列是否已空
Front與rear的值相等,則該隊列為空。
5.如何判斷循環對了是否已滿
預備知識 :由于是循環隊列,front的值可能比rear大,可能比rear小,也能相等,兩者沒有規律。但是隊首旋轉的速度不能比隊尾快。
當存放元素的數目等于數組的存儲位置個數,則rear和front重合。分不清頭和尾。
所以我們少用一個存儲位置。
c語言偽算法表示是:
隊列滿的條件:if ((rear+1)%數組長度==front)已滿
Else 不滿
#include
#include
#include"stdbool.h"//解決不能使用bool
#include "malloc.h"
//隊定義
typedef struct Queue
{
int *pBase;//數組基地址,數組的首地址
int front;//隊頭
int rear;//隊尾巴
}QUEUE;
void init(QUEUE*);//創建循環隊列
bool en_queue(QUEUE*,int ); //入隊
void traverse_queue(QUEUE*);//遍歷
bool emput_queue(QUEUE* );//隊是否滿
bool full_queue(QUEUE *);//對列是否空
bool out_queue(QUEUE *,int *);//出隊
int main()
{
int Val;
QUEUE Q;
init(&Q);
en_queue(&Q,1);
en_queue(&Q,2);
en_queue(&Q,3);
en_queue(&Q,4);
en_queue(&Q,5);
traverse_queue(&Q );//遍歷
if(out_queue(&Q ,&Val))
{
printf("出隊成功,出隊的元素是%dn",Val);
traverse_queue(&Q );//遍歷
}
return 0;
}
//創建一個隊列,空間分配,保存6個整形元素。
void init (QUEUE *pQ)
{
pQ->pBase=(int*)malloc(sizeof(int)*6);//長度為6的數組
pQ->front=0;
pQ->rear=0;
}
//判斷循環隊列是否滿
bool full_queue(QUEUE *pQ)
{
if((pQ->rear+1)%6==pQ->front)
{
return true;
}
else
return false;
}
//進隊,隊尾rear+1;
bool en_queue(QUEUE *pQ,int val)
{
if(full_queue(pQ))
{
return false;
}
else
{
pQ->pBase[pQ->rear]=val;
pQ->rear=(pQ->rear+1)%6;
}
}
//利用中間變量,遍歷隊列
void traverse_queue(QUEUE *pQ)
{
printf("隊列遍歷結果如下n");
int i= pQ->front;
while(i!=pQ->rear)
{
printf("%d ",pQ->pBase[i]);
i=(i+1)%6;
}
printf("n");
return ;
}
bool emput_queue(QUEUE* pQ)
{
if(pQ->front==pQ->rear)
return true;
else
return false;
}
//出隊,隊頭front+1
bool out_queue(QUEUE *pQ,int *pVal)
{
if(emput_queue(pQ))
return false;
else
{ ??*pVal=pQ->pBase[pQ->front];
pQ->front=(pQ->front+1)%6;
return true;
}
}