循环队列——C语言

队列的特点是先进先出。在队列的存储过程中,不仅使用了一组地址连续的存储单元存放从队列头到队列尾的元素,而且还附设了两个指针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;
}
运行结果:

         

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值