队列的特点是先进先出。在队列的存储过程中,不仅使用了一组地址连续的存储单元存放从队列头到队列尾的元素,而且还附设了两个指针front和rear,分别指示队列头元素及队列尾元素的位置。
队列操作示意图(出自严蔚敏版数据结构)
对链表的增加是通过移动rear指针,链表的删除时通过移动front的移动。通过这两个指针实现队列的先进先出。
循环队列是将头尾连接起来(出自严蔚敏版数据结构)
队空时,front、rear指针指在同一个元素位置。队满时rear指针的下一位时front。增加、删除指针移动与队列一致。
代码实现:
#include<stdio.h>
#define Maxq 4
typedef struct
{
int data[Maxq];
int front;
int rear;
}squeue;
/**操作界面**/
void prin_1()
{
printf ("\n1、创建队列\n");
printf("2、入队列\n");
printf("3、出队列\n");
printf("4、取队列首元素\n");
printf("5、显示全部队列元素\n");
printf("0、end\n");
puts("-------------------------------------------------\n");
}
/**创建队列**/
squeue creatQueue(squeue Q)
{
Q.front=Q.rear=0;//将两个指针指在同一个位置
printf("创建队列成功!\n");
return Q;
}
/**入队列**/
squeue InitQueue(squeue Q,int e)
{
if((Q.rear+1)%Maxq==Q.front)//当rear的下一个是front时,队满
{
printf("队列已满!\n");
return Q;
}
else
{
Q.data[Q.rear]=e;//将元素存入对应下标的数组
Q.rear=(Q.rear+1)%Maxq;//将rear指针向后移动
return Q;
}
}
/**出队列**/
squeue outQueue(squeue Q)
{
int a;
if((Q.front==Q.rear)) return Q;//若对空,则直接返回Q
else
{
a=Q.data[Q.front];//否则移动front指针进行删除
Q.front=(Q.front+1)%Maxq;
printf("出队列元素为: %d ",a);
return Q;
}
}
/**取队列首元素**/
int Getop(squeue Q,int a)
{
if((Q.front==Q.rear)) return 0;
else
{
a=Q.data[Q.front];
return a;
}
}
/**计算队列长度**/
int l_queue(squeue Q)
{
if((Q.front>Q.rear))
return ((Q.rear+Maxq)-Q.front);
else
{
return (Q.rear-Q.front);
}
}
/**输出全部队列元素**/
void prinQueue(squeue Q)
{
int i;
int k;
k=l_queue(Q);
if((Q.front==Q.rear))
{
printf("队列为空!\n");
}
else
{
printf("队列元素为:\n");
for(i=1;i<=k;i++)
{
printf(" %d ",Q.data[Q.front]);
Q.front=(Q.front+Maxq+1)%Maxq;//指针向后移
}
printf("\n");
}
}
int main(void)
{
squeue Q;
int x,a;
while(1)
{
prin_1();
printf("请选择所要进行的操作:\n");
scanf("%d",&x);
if(x==0)
break;
switch(x)
{
case 1: ///创建队列
Q=creatQueue(Q);
break;
case 2: ///入队列
printf("请输入队列元素:\n");
scanf("%d",&a);
Q=InitQueue(Q,a);
break;
case 3: ///出队列
Q=outQueue(Q);
printf("\n");
break;
case 4: ///取队列首元素
a=Getop(Q,a);
printf(" 队列首元素: %d ",a);
printf("\n");
break;
case 5: ///输出全部队列元素
prinQueue(Q);
printf("\n");
break;
default :
printf("输入错误!\n");
break;
}
}
return 0;
}
运行结果: