Linux数据结构——队列(顺序表实现)

本文详细介绍了如何使用数组模拟线性队列来实现“先进先出”的数据结构。队列操作包括初始化、销毁、入队、出队和取队首元素。文章还提供了具体的代码实现和测试案例,帮助读者理解队列的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先我们要理解队列所遵循的规则就是“先进先出”。我们可以看到生活中排队的例子(如:排队买票、排队打饭)其实就是一个队列。

如同栈一样,为了保证队列的安全性,我们对队列的操作也只有三种:入队列、出队列、取队首元素。

这篇文章主要是用数组来实现一个队列,为了使队列的空间能充分利用,所以用线性队列来模拟环形队列来实现。

#define SeqQueueMaxSize 1000
typedef char SeqQueueType;

typedef struct SeqQueue
{
    SeqQueueType data[SeqQueueMaxSize];
    size_t head;
    size_t tail;
    size_t size;
}SeqQueue;

宏SeqQueueMaxSize 是设定了整个数组内可以存放的个数,head 是队首元素在数组内的下表,tail是队尾元素在数组内的下表,size是真个队列中我们存的元素的总个数。

一.队列的初始化

void  SeqQueueInit(SeqQueue* q)
{
    if (q == NULL)
        return;
    q->size = 0;
    q->head = 0;
    q->tail = 0;
    return;
}

首先要对指针的非法性判断。

然后将里面的个数置0。我头和尾从0开始。

二.队列的销毁

void  SeqQueueDestory(SeqQueue* q)
{
    if (q == NULL)
        return;
    q->size = 0;
    q->head = 0;
    q->tail = 0;
    return;
}

销毁其实和初始化的操作一样。因为我们并不是用malloc开辟的空间,就不需要free来释放。将队列存的元素个数置0,头和尾置0,从0开始。

三.入队列

void SeqQueuePush(SeqQueue* q, SeqQueueType value)
{
    if (q == NULL)
        return;
    if (q->size >= SeqQueueMaxSize)
        return;
       //q->data[q->size++] = value;//wrong
    q->data[q->tail++] = value;//xian yong hou jia
    ++q->size;
    if (q->tail >= SeqQueueMaxSize)
    {
        q->tail = 0;
    }
    return;
}

思路:

1.传参:你要入哪个队列,你要入什么元素;

2.首要的还是对指针的合法性做判断;

3.判断是否满了,你还能不能入?

4.在尾部插入新元素;如果新插入的元素已经排到这个队列的最后一个位置了,就需要将tail置0,从头开始。

5.再将整个队列中的元素size++。

四.出队列

void SeqQueuePop(SeqQueue* q)
{
    if (q == NULL)
        return;
    if (q->size == 0)
        return;
    ++q->head;
    if (q->head >= SeqQueueMaxSize)
        q->head = 0;
    --q->size;
    return;
}

思路:

1.传参:你要出哪个队列的元素

2.指针的合法性判断

3.判断这个队列是否是空队列

4.出队列,扔掉队首元素。如果此时的head是否已经到了整个队列的最后一个位置,则将head置0,继续从头开始。

5.整个队列的元素个数size--。

五.取队首元素

int SeqQueueTop(SeqQueue* q, SeqQueueType* value)
{
    if (q == NULL || value == NULL)
        return 1;
    if (q->size == 0)
        return 1;
    *value = q->data[q->head];
    return 0;
}

思路:

1.传参:要从哪个队列中取,取出的元素为value。这里的value 是输出型参数。

2.指针的合法性判断。

3.空队列判断。如果是空队列则无法取队首元素。

4.将队首的元素赋值给value。

如果取成功则返回0,失败返回1。

测试函数:

void Test()
{
    SeqQueue queue;
    SeqQueueInit(&queue);
    SeqQueuePush(&queue,'a');
    SeqQueuePush(&queue,'b');
    SeqQueuePush(&queue,'c');
    SeqQueuePop(&queue);
    SeqQueueType value;
    int temp = SeqQueueTop(&queue, &value);
    if (temp == 0)
        printf("%c\n", value);
    return;
}
int main()
{
    Test();
    return 0;
}

做了一个简单的测试,并没有把所有特殊情况考虑。

读者可也根据需要,加测试语句。

测试结果:


先初始化一个队列,再入队列三个元素'a' ,'b', 'c',再出一个元素。则队列里剩下'b' , 'c'两个元素,取队首元素,则输出结果为'b'。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值