循環隊列與非循環隊列的區別:
1~判斷隊列爲空:
Q->rel==Q->font;
2~判斷隊列爲滿:
非循環隊列:Q->rel==size;
循環隊列: ( Q->rel+1)%size==Q->font;
(循環隊列需要空出一個位置,且這個位置是不固定的,但它的下標一定爲Q->fear-1.
如果不空出這個位置,那麼當Q->rel==Q->font時,隊列既可能爲空,又可能爲滿。
循環隊列很好的解決了隊列假溢出這個問題。)
3~rel和font下標後移操作:
非循環隊列:++Q->rel; ++Q->font;
循環隊列: Q->rel=(Q->rel+1)%size; Q->font=(Q->font+1)%size;
4~求隊列長度:
非循環隊列:n=Q->rel;
循環隊列: n=((Q->rel+size)-Q->font)%size;
#include<stdio.h>
#include<stdlib.h>
#define size 5
typedef struct node
{
int data[size];
int font;
int rel;
} Queue,*Queuep;
Queuep creatQueue(Queuep Q) //創建隊列
{
int x,i=1;
printf("請輸入第%d個元素:",i++);
scanf("%d",&x);
while(x!=-1)
{
Q->data[Q->rel++]=x;
printf("請輸入第%d個元素:",i++);
scanf("%d",&x);
}
return Q;
}
void print_Queue(Queuep Q) //打印隊列
{
int i;
if(isEmpty(Q))
{
printf("棧已空!!!\n");
return Q;
}
i=Q->font;
while(i!=Q->rel)
{
printf("%d ",Q->data[i++]);
if(i==size) //此隊列爲循環隊列
i=0;
}
printf("\n");
}
Queuep in_Queue(Queuep Q,int x) //元素入隊
{
if(isFull(Q))
{
printf("隊列已滿!!!\n");
return Q;
}
Q->data[Q->rel]=x;
Q->rel=(Q->rel+1)%size; //此隊列爲循環隊列
return Q;
}
Queuep out_Queue(Queuep Q) //元素出隊
{
if(isEmpty(Q))
{
printf("棧已空!!!\n");
return Q;
}
else
{
printf("出隊的元素爲:%d\n",Q->data[Q->font]);
Q->font=(Q->font+1)%size; //此隊列爲循環隊列
return Q;
}
}
Queuep get_Queue(Queuep Q) //獲取隊首元素
{
if(isEmpty(Q))
{
printf("棧已空!!!\n");
return NULL;
}
return Q->data[Q->font];
}
int isEmpty(Queuep Q) //判斷隊空
{
if(Q->rel==Q->font)
return 1;
else
return 0;
}
int isFull(Queuep Q) //判斷隊滿
{
if((Q->rel+1)%size==Q->font)
return 1;
else
return 0;
}
int length_Queue(Queuep Q) //求隊列長隊(元素個數)
{
return ((Q->rel+size)-Q->font)%size; //此隊列爲循環隊列
}
int main()
{
int n;
int x;
Queuep Q;
Q=(Queuep)malloc(sizeof(Queue));
Q->font=Q->rel=0;
Q=creatQueue(Q); //創建隊列
print_Queue(Q);
printf("隊列的長度爲:%d\n",length_Queue(Q));
printf("請輸入需要入隊的元素:"); //元素入隊
scanf("%d",&x);
Q=in_Queue(Q,x);
print_Queue(Q);
Q=out_Queue(Q); //元素出隊
printf("元素出隊後的隊列爲:");
print_Queue(Q);
x=get_Queue(Q); //獲取隊首元素
if(!isEmpty(Q))
printf("隊首元素爲:%d\n",x);
x=length_Queue(Q); //求隊列長度(元素的個數)
printf("隊列長度爲:%d\n",x);
return 0;
}