数据结构——静态队列


前言

相比于栈,队列是一种可以实现“先进先出”储存的方式,在跟时间有关的操作中密不可分,它分为链式队列(以链表为背景)和静态队列(以数组为背景),这篇文章主要简单的写一下静态队列。


一、代码如下

# include<stdio.h>
# include<stdlib.h>
# include<stdbool.h>

struct queue//定义一个静态的队列,也就是以数组为背景的队列
{
    int front;//是最初放入的元素的位置
    int rear;//是最近一次放入的元素的位置
    int* pBase;//指向动态分配的数组
};

void init(struct queue* pQ)//初始化队列
{
    pQ->front = pQ->rear = 0;
    pQ->pBase = (struct queue*)malloc(sizeof(int) * 6);//假定pQ->pBase指向一个长度为6的数组
}

bool en_queue(struct queue* pQ, int val)//入队函数
{
    if ((pQ->rear + 1) % 6 == pQ->front)//如果rear的位置往前移一个是front的位置,就说明已经满了,但仅为判断,不能将pQ->rear的位置向后移一个
    {
        return false;
    }
    else
    {
        pQ->pBase[pQ->rear] = val;//rear的位置是最后一个元素的下一个元素,该位置肯定为空,所以给该位置的数组元素直接赋值
        pQ->rear = (pQ->rear + 1) % 6;//rear的位置向后移一位,如果移到了6的位置,就相当于从0继续循环
    }
}

void traverse(struct queue* pQ)//遍历队列函数
{
    int i = pQ->front;
    while (i != pQ->rear)
    {
        printf("%d ", pQ->pBase[i]);
        i = (i + 1) % 6;
    }
    printf("\n");
    return;
}

bool empty_queue(struct queue* pQ)//判断队列是否为空,为空返回true
{
    if (pQ->front == pQ->rear)
        return true;
    else
        return false;
}

bool out_queue(struct queue* pQ, int* pVal)//出队函数
{
    if (empty_queue(pQ))
    {
        return false;
    }
    else
    {
        *pVal = pQ->pBase[pQ->front];
        pQ->front = (pQ->front + 1) % 6;
        return true;
    }
}

int main()
{
    struct queue q;
    int val;
    /*对队列进行初始化*/
    init(&q);
    /*入队功能*/
    en_queue(&q, 0);
    en_queue(&q, 1);
    en_queue(&q, 2);
    en_queue(&q, 3);
    en_queue(&q, 4);
    en_queue(&q, 5);//5和6都不会输出,因为在存储的时候为了区分队列 是否已满 和队列 是否为空 两个功能上
                    //不能将数组存满,需要空出来一个元素的位置
    en_queue(&q, 6);
    traverse(&q);
    /*出队功能*/
    if (out_queue(&q, &val))
    {
        printf("出队成功, 出队的元素为:%d\n", val);
    }
    else
    {
        printf("出队失败\n");
    }
    traverse(&q);//再次遍历进行验证

    return 0;
}

二、调试结果

如下(示例):

0 1 2 3 4
出队成功, 出队的元素为:0
1 2 3 4


总结

1.简单的写了些队列的基本功能,其实链式队列比静态队列要简单一些,只需要将入队的操作类比成入动态栈,出队的操作改成动态栈中底部的指针向上挪一位就可以了。

2.在对静态队列操作时一定要注意,在存储的时候一定要空出来一个元素,这样才能同时实现判断队列是否为满功能和队列是否为空的功能。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值