前言:
还是一如既往的欢迎大家啦!这一篇是为了简述本次实现队列的c语言操作,话不多说,我们直接入手吧!
队列的性质:
1.应用场景
队列是为了实现公平性或者合理性而存在的,实际的应用场景比如:排队 保持绝对公平性 和广度优先遍历 BFS
2.特点
队列的机制是先进先出,后进后出。可以说和栈完全相反的机制,那么根据这个机制,我们同样可以用数组或者链表来实现这个数据结构,但是由于我们要取头,相对于数组要扩展内存来说链表会更加适合一点,所以这次我用单链表来实现这个队列。
队列的实现:
1.队列函数的声明:
(下面的使用场景在vs2022)
//QListNode.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include <stdbool.h>//队列的实现 先进先出 后进后出
typedef int QDataType;
//使用链表进行实现 如果用数组的话不方便出列
typedef struct QListNode {//首先创建一个类似于单链表的结构
struct QlisNode* next;
QDataType x;}QNode;
//下面在定义一个结构体用来表示队列的结构 即队头和队尾
typedef struct Queue{
QNode* head;
QNode* tail;
}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);
2.功能的实现:
//QListNode.c
#include"QListNode.h"
void QueueInit(Queue* q)
{
assert(q);
q->head = q->tail = NULL;}
void QueuePush(Queue* q, QDataType data)
{
assert(q);// 尾插 先创建一个节点
QNode* node = (QNode*)malloc(sizeof(QNode));
if (node == NULL)
{
printf("node :: malloc ┭┮﹏┭┮ 没有申请到内存哦~");
exit(-1);
}
node->next = NULL;
node->x = data;//第一次添加
if (q->tail == NULL)
{
q->head = q->tail = node;
}
else//正常尾插
{
q->tail->next = node;
q->tail = node;
}
}void QueuePop(Queue* q)
{
assert(q);
//判断数据是否是空
assert(!QueueEmpty(q));//第一种情况 只剩一个数据了
if (q->head == q->tail)
{
free(q->head);
q->head = q->tail = NULL;
}
else//第二种情况 正常弹出
{
QNode* next = q->head;
q->head = next->next;
free(next);
next = NULL;
}
}//输出头元素 即出列
QDataType QueueFront(Queue* q)
{
assert(q);
assert(!QueueEmpty(q));return q->head->x;
}
//输出尾元素
QDataType QueueBack(Queue* q)
{
assert(q);
assert(!QueueEmpty(q));return q->tail->x;
}//计算队列里的有效数据
int QueueSize(Queue* q)
{
int n = 0;
assert(q);QNode* p = q->head;
while (p != NULL)
{
p = p->next;
n++;
}return n;
}//判断数据是否为空
bool QueueEmpty(Queue* q)
{
assert(q);return q->head == NULL;
}//摧毁队列
void QueueDestroy(Queue* q)
{
assert(q);QNode* p = q->head;
while (p)
{
QNode* tmp = p;
p = p->next;
free(tmp);}
q->head = q->tail = NULL;}
好啦,以上就是队列的简易实现啦!谢谢!