数据结构 队列

简介: 利用C语言实现的数据结构队列

1.队列的概念及结构
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头。
image.png
队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低

2.队列的代码实现
接口声明

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef int QDataType;
// 链式结构:表示队列 
typedef struct QListNode
{
    struct QListNode* _next;
    QDataType _data;
}QNode;
// 队列的结构 
typedef struct Queue
{
    QNode* _front;
    QNode* _rear;
}Queue;
// 初始化队列 
void QueueInit(Queue* q);
// 队尾入队列 
void QueuePush(Queue* q, QDataType data);
// 队头出队列 
void QueuePop(Queue* q);
// 获取队列头部元素 
QDataType QueueFront(Queue* q);
// 获取队列队尾元素 
QDataType QueueBack(Queue* q);
// 获取队列中有效元素个数 
int QueueSize(Queue* q);
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
bool QueueEmpty(Queue* q);
// 销毁队列 
void QueueDestroy(Queue* q);

接口的实现

#define _CRT_SECURE_NO_WARNINGS 1
#include"Queue.h"
void QueueInit(Queue* q)
{
    assert(q);
    q->_front = NULL;
    q->_rear = NULL;

}
void QueuePush(Queue* q, QDataType data)
{
    assert(q);
    if (q->_front == NULL)
    {
        QNode* tmp = (QNode*)malloc(sizeof(QNode));
        tmp->_data = data;
        tmp->_next = NULL;
        q->_front = q->_rear = tmp;
    }
    else
    {
        QNode* tmp = (QNode*)malloc(sizeof(QNode));
        tmp->_data = data;
        tmp->_next = NULL;
        q->_rear->_next = tmp;
        q->_rear = tmp;
    }


}
void QueuePop(Queue* q)
{
    assert(q->_front!=NULL);
    QNode *tmp=q->_front->_next;
    free(q->_front);
    q->_front = tmp;

}
QDataType QueueFront(Queue* q)
{
    assert(q->_front);
    return q->_front->_data;


}
QDataType QueueBack(Queue* q)
{
    assert(q->_rear);
    return q->_rear->_data;
}
int QueueSize(Queue* q)
{
    QNode* tmp = q->_front;
    int num = 0;
    while (tmp)
    {
        num++;
        tmp = tmp->_next;

    }
    return num;

}
bool QueueEmpty(Queue* q)
{
    return q->_front == NULL;

}
void QueueDestroy(Queue* q)
{
    QNode* tmp = q->_front;
    while (tmp)
    {
        QNode* next = tmp->_next;
        free(tmp);
        tmp = next;
    }

}

结尾:今天的分享到此结束,喜欢的朋友如果感觉有帮助可以点赞三连支持,咱们共同进步!

目录
相关文章
|
18天前
|
缓存 算法 调度
数据结构之 - 双端队列数据结构详解: 从基础到实现
数据结构之 - 双端队列数据结构详解: 从基础到实现
45 5
|
18天前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
84 64
|
11天前
初步认识栈和队列
初步认识栈和队列
36 10
|
11天前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
15 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
13天前
|
存储 安全 Java
【用Java学习数据结构系列】探索栈和队列的无尽秘密
【用Java学习数据结构系列】探索栈和队列的无尽秘密
25 2
【数据结构】--- 栈和队列
【数据结构】--- 栈和队列
|
1月前
|
存储 Java
【数据结构】优先级队列(堆)从实现到应用详解
本文介绍了优先级队列的概念及其底层数据结构——堆。优先级队列根据元素的优先级而非插入顺序进行出队操作。JDK1.8中的`PriorityQueue`使用堆实现,堆分为大根堆和小根堆。大根堆中每个节点的值都不小于其子节点的值,小根堆则相反。文章详细讲解了如何通过数组模拟实现堆,并提供了创建、插入、删除以及获取堆顶元素的具体步骤。此外,还介绍了堆排序及解决Top K问题的应用,并展示了Java中`PriorityQueue`的基本用法和注意事项。
40 5
【数据结构】优先级队列(堆)从实现到应用详解
|
18天前
|
消息中间件 存储 Java
数据结构之 - 深入探析队列数据结构: 助你理解其原理与应用
数据结构之 - 深入探析队列数据结构: 助你理解其原理与应用
23 4
|
19天前
【初阶数据结构】深入解析队列:探索底层逻辑
【初阶数据结构】深入解析队列:探索底层逻辑
|
27天前
|
前端开发
07_用队列实现栈
07_用队列实现栈