[cpp]
線性結構的倆種常見應用之二——隊列
定義:
一種實現“先進先出”的存儲結構
分類:
鏈式隊列
靜態隊列
靜態隊列通常都必須是循環隊列 判斷隊列是否已滿:
隊列需要倆個參數即front 頭和rear尾 if((rear+1)%數組長度)==f)
入隊:rear=(rear+1)%數組長度 已滿
出隊:front=(front+1)%數組長度 else
未滿
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//隊列一定是循環的
typedef struct Queue{
int *pBase;
int front;
int rear;
}QUEUE;
void init(QUEUE *);//隊列的初始化
bool en_queue(QUEUE *,int val);//入隊pQ->rear=(pQ->rear+1)%6;
void traverse_queue(QUEUE*);//遍歷輸出
bool full_queue(QUEUE*);//判斷是否為滿pQ->rear+1)%6==pQ->front
bool out_queue(QUEUE *,int*);//出隊 pQ->front=(pQ->front+1)%6;
bool emput_queue(QUEUE *);//判斷是否為空pQ->front==pQ->rear
int main(void)
{
int val,val1;
QUEUE Q;
init(&Q); //通過取地址將實參傳入形參
printf("入隊的元素以0結束\n");
while(val1!=0) //通過while循環入隊
{
printf("請輸入入隊的元素:");
scanf("%d",&val1);
en_queue(&Q,val1);
}
traverse_queue(&Q);
printf("\n");
while(out_queue(&Q,&val)) //用while進行出隊
{
printf("出隊的元素是:%d\n",val);
}
/*if(out_queue(&Q,&val))
{
printf("出隊成功!出隊的元素是 %d",val);
}
else{
printf("出隊失敗!");
}*/
return 0;
}
void init(QUEUE *pQ) //隊列的初始化
{
pQ->pBase=(int*)malloc(sizeof(int)*6);//申請隊列的長度為6由於隊列是循環隊列所以只能
//存5個值,即始終是頭尾只有一個存值
pQ->front=0;
pQ->rear=0;
}
bool full_queue(QUEUE *pQ)
{
if((pQ->rear+1)%6==pQ->front) //判斷隊滿的標志
{
return true;
}
else
{
return false;
}
}
bool en_queue(QUEUE *pQ,int val)
{
if(full_queue(pQ))
{
return false;
}
else{
pQ->pBase[pQ->rear]=val;//入隊,將val值添加在尾的後面
pQ->rear=(pQ->rear+1)%6;
return true;
}
}
void traverse_queue(QUEUE *pQ)
{
int i=pQ->front; //從頭開始
while(i!=pQ->rear) //直到尾
{
printf("%d ",pQ->pBase[i]);
i=(i+1)%6; //實際上等同於i++
}
return;
}
bool emput_queue(QUEUE *pQ)
{
if(pQ->front==pQ->rear) //為空的標志
return true;
else
return false;
} www.2cto.com
bool out_queue(QUEUE *pQ,int *pVal)//出隊,將出隊的值保存在PVal中
{
if(emput_queue(pQ))
{
return false;
}
else
{
*pVal=pQ->pBase[pQ->front];//出隊,從頭開始出隊將出隊的值保存在PVal中
pQ->front=(pQ->front+1)%6;
}
}