循环队列与非循环队列的区别:
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;
}