数据结构 队列

简介: 利用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;
    }

}

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

目录
相关文章
|
17天前
|
存储 Java
【数据结构】优先级队列(堆)从实现到应用详解
本文介绍了优先级队列的概念及其底层数据结构——堆。优先级队列根据元素的优先级而非插入顺序进行出队操作。JDK1.8中的`PriorityQueue`使用堆实现,堆分为大根堆和小根堆。大根堆中每个节点的值都不小于其子节点的值,小根堆则相反。文章详细讲解了如何通过数组模拟实现堆,并提供了创建、插入、删除以及获取堆顶元素的具体步骤。此外,还介绍了堆排序及解决Top K问题的应用,并展示了Java中`PriorityQueue`的基本用法和注意事项。
22 5
【数据结构】优先级队列(堆)从实现到应用详解
|
4天前
|
前端开发
07_用队列实现栈
07_用队列实现栈
|
4天前
|
测试技术
02_由两个栈组成的队列
02_由两个栈组成的队列
|
7天前
|
存储
|
24天前
|
存储 C语言
数据结构基础详解(C语言): 栈与队列的详解附完整代码
栈是一种仅允许在一端进行插入和删除操作的线性表,常用于解决括号匹配、函数调用等问题。栈分为顺序栈和链栈,顺序栈使用数组存储,链栈基于单链表实现。栈的主要操作包括初始化、销毁、入栈、出栈等。栈的应用广泛,如表达式求值、递归等场景。栈的顺序存储结构由数组和栈顶指针构成,链栈则基于单链表的头插法实现。
150 3
|
26天前
|
Java
【数据结构】栈和队列的深度探索,从实现到应用详解
本文介绍了栈和队列这两种数据结构。栈是一种后进先出(LIFO)的数据结构,元素只能从栈顶进行插入和删除。栈的基本操作包括压栈、出栈、获取栈顶元素、判断是否为空及获取栈的大小。栈可以通过数组或链表实现,并可用于将递归转化为循环。队列则是一种先进先出(FIFO)的数据结构,元素只能从队尾插入,从队首移除。队列的基本操作包括入队、出队、获取队首元素、判断是否为空及获取队列大小。队列可通过双向链表或数组实现。此外,双端队列(Deque)支持两端插入和删除元素,提供了更丰富的操作。
26 0
【数据结构】栈和队列的深度探索,从实现到应用详解
【数据结构】栈和队列
【数据结构】栈和队列
|
2月前
|
存储
【数据结构】栈和队列-->理解和实现(赋源码)
【数据结构】栈和队列-->理解和实现(赋源码)
27 5
|
3月前
|
存储 前端开发 DataX
【数据结构】栈和队列
数据结构中的栈和队列
33 1
【数据结构】栈和队列
|
2月前
|
机器学习/深度学习 消息中间件 缓存
栈与队列的实现
栈与队列的实现
40 0