图解C语言实现队列

1、顺序队列

由于顺序队列的底层使用的是数组实现,因此要预先申请一块足够大的内存空间初始化队列,此外,遵循队列“先进先出,后进后出(FIFO)”原则,我们还需要定义一个队头指针top,和队尾指针rear,如图一所示。

在这里插入图片描述

图 1 顺序队列实现示意图

由于顺序队列初始状态没有存储任何元素,因此top指针和rear指针重合,且由于顺序队列底层通过数组实现,因此top和rear实际上是两个变量,它们的值分别是队头元素和队尾元素所在数组位置的下标。在图 1 的基础上,当有数据元素进队列时,对应的实现操作是将其存储在指针 rear 指向的数组位置,然后 rear+1;当需要队头元素出队时,仅需做top+1 操作。

例如,在图 1 基础上将 {1,2,3,4} 用顺序队列存储的实现操作如图 2 所示:

在这里插入图片描述

图 2 数据进顺序队列的过程实现示意图

在图 2 基础上,顺序队列中数据出队列的实现过程如图 3 所示:

在这里插入图片描述

图 3 数据出顺序队列的过程示意图
代码实现
#include <stdio.h>


/**
  * @brief  入队
  * @param *a:队列名, rear:队尾指针, data:插入数据
  * @retval 队尾指针
  */
int enQuece(int *a,int rear,int data)
{
    
    a[rear]=data;
    rear++;
    return rear;
    
}

/**
  * @brief  出队
  * @param *a:队列名, front:队头指针, rear:队尾指针
  * @retval 
  */
void deQuece(int *a,int front,int rear)
{
    //front == rear ,说明队列空
    while(front != rear)
    {
       printf("出队元素:%d\n",a[front]); 
        front++;
    }
    
}

void main(void)
{
    int a[100];
    int front,rear;
    front =rear = 0;
    //入队
    rear =enQuece(a,rear,1);
    rear =enQuece(a,rear,2);
    //出队
    deQuece(a,front,rear);
    
}

在这里插入图片描述

2、循环队列

在这里插入图片描述

图 4 环状顺序队列
图 4 只是一个想象图,在真正的实现时,没必要真创建这样一种结构,我们还是使用之前的顺序表,也还是使用之前的程序,只需要对其进行一点小小的改变:
#include <stdio.h>
#define max 5//表示顺序表申请的空间大小
int enQueue(int *a,int front,int rear,int data){
    //添加判断语句,如果rear超过max,则直接将其从a[0]重新开始存储,如果rear+1和front重合,则表示数组已满
    if ((rear+1)%max==front) {
        printf("空间已满");
        return rear;
    }
    a[rear%max]=data;
    rear++;
    return rear;
}
int  deQueue(int *a,int front,int rear){
    //如果front==rear,表示队列为空
    if(front==rear%max) {
        printf("队列为空");
        return front;
    }
    printf("%d ",a[front]);
    //front不再直接 +1,而是+1后同max进行比较,如果=max,则直接跳转到 a[0]
    front=(front+1)%max;
    return front;
}
int main() {
    int a[max];
    int front,rear;
    //设置队头指针和队尾指针,当队列中没有元素时,队头和队尾指向同一块地址
    front=rear=0;
    //入队
    rear=enQueue(a,front,rear, 1);
    rear=enQueue(a,front,rear, 2);
    rear=enQueue(a,front,rear, 3);
    rear=enQueue(a,front,rear, 4);
    //出队
    front=deQueue(a, front, rear);
    //再入队
    rear=enQueue(a,front,rear, 5);
    //再出队
    front=deQueue(a, front, rear);
    //再入队
    rear=enQueue(a,front,rear, 6);
    //再出队
    front=deQueue(a, front, rear);
    front=deQueue(a, front, rear);
    front=deQueue(a, front, rear);
    front=deQueue(a, front, rear);
    return 0;
}

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炒番茄蛋的厨子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值