C语言顺序存储队列

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、什么是队列的顺序存储

1、队列是只允许在一端进行插入操作,另一端进行删除操作的线性表。
2、使用数组来存取队列元素的结构叫队列的顺序存储结构。
3、假设一个队列有n个元素,则顺序存储的队列需要建立一个大于n的数组,并把队列的所有元素存储在数组的前n个单元,数组下标为0的一端即为对头。
(1)入队,就是在队尾追加一个元素,不需要移动任何元素,所以时间复杂度为O(1).
(2)出队是在队头,即下标为0的位置,也就意味着,队列中的所有位置都得向前移动,以保证下标为0的位置,即对头不为空。此时时间复杂度为O(n)。

二、程序

#include <stdio.h>
#include <stdlib.h>
#include "./seq_queue.h"

//队列结构体
typedef struct
{
    int size;      //元素个数
    int data[MAX]; //队列
} SeqQueue;

//初始化
SeqQueue *init_queue(void);
//入队
void push_queue(SeqQueue *queue, int data);
//出队
void pop_queue(SeqQueue *queue);
//获取队头元素
int get_front_data(SeqQueue *queue);
//获取队尾元素
int get_back_data(SeqQueue *queue);
//获取元素个数
int get_size(SeqQueue *queue);
//清空
void empty_queue(SeqQueue *queue);
//销毁
void destroy_queue(SeqQueue *queue);

//初始化
SeqQueue *init_queue(void)
{
    SeqQueue *my_queue = (SeqQueue *)calloc(1, sizeof(SeqQueue));
    return my_queue;
}

//入队
void push_queue(SeqQueue *queue, int data)
{
    if (queue == NULL)
    {
        return;
    }
    queue->data[queue->size] = data;
    queue->size++;
}

//出队
void pop_queue(SeqQueue *queue)
{
    if (queue == NULL)
    {
        return;
    }
    if (queue->size == 0)
    {
        return;
    }
    for (int i = 1; i < queue->size; i++)
    {
        queue->data[i - 1] = queue->data[i];
    }
    queue->size--;
}

//获取队头元素
int get_front_data(SeqQueue *queue)
{
    if (queue == NULL)
    {
        printf("错误\r\n");
        return -1;
    }
    if (queue->size == 0)
    {
        printf("队为空\r\n");
        return 0;
    }

    return queue->data[0];
}

//获取队尾元素
int get_back_data(SeqQueue *queue)
{
    if (queue == NULL)
    {
        printf("错误\r\n");
        return -1;
    }
    if (queue->size == 0)
    {
        printf("队为空\r\n");
        return 0;
    }
    return queue->data[queue->size - 1];
}

//获取元素个数
int get_size(SeqQueue *queue)
{
    if (queue == NULL)
    {
        printf("错误\r\n");
        return -1;
    }

    return queue->size;
}

//清空
void empty_queue(SeqQueue *queue)
{
    if (queue == NULL)
    {
        return;
    }

    while (queue->size)
    {
        pop_queue(queue);
    }
}

//销毁
void destroy_queue(SeqQueue *queue)
{
    if (queue == NULL)
    {
        return;
    }

    free(queue);
}

int main(int argc, char const *argv[])
{
    SeqQueue *my_queue = init_queue();

    push_queue(my_queue, 10);
    push_queue(my_queue, 20);
    push_queue(my_queue, 30);
    push_queue(my_queue, 40);
    push_queue(my_queue, 50);
    printf("队头元素 = %d\r\n", get_front_data(my_queue));
    printf("队尾元素 = %d\r\n", get_back_data(my_queue));
    printf("元素个数 = %d\r\n", get_size(my_queue));
    pop_queue(my_queue);
    pop_queue(my_queue);
    printf("队头元素 = %d\r\n", get_front_data(my_queue));
    printf("队尾元素 = %d\r\n", get_back_data(my_queue));
    printf("元素个数 = %d\r\n", get_size(my_queue));
    empty_queue(my_queue);
    printf("元素个数 = %d\r\n", get_size(my_queue));
    destroy_queue(my_queue);
    my_queue = NULL;

    return 0;
}

运行结果:

队头元素 = 10
队尾元素 = 50
元素个数 = 5
队头元素 = 30
队尾元素 = 50
元素个数 = 3
元素个数 = 0

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值