队列
1 代码位置
gitee
2 概念与结构
1.1概念
只允许在⼀端进行插⼊数据操作,在另⼀端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)
⼊队列:进⾏插⼊操作的⼀端称为队尾
出队列:进⾏删除操作的⼀端称为队头
1.2结构
队列也可以数组和链表的结构实现,使⽤链表的结构实现更优⼀些,因为如果使⽤数组的结构,出队列在数组头上出数据,效率会⽐较低。 **数组头删时间复杂度:O(N) ** 数组尾插时间复杂度:O(1) 单链表头删时间复杂度:O(1) 单链表尾插时间复杂度:O(N)
- 乍一看二者难分伯仲,但如果我们在单链表的结构里再定义一个指向尾结点的指针,那么单链表就可以实现O(1)的尾插时间复杂度,而数组没有什么特别好的办法实现这种转变。
2 队列的实现
Queue.h
代码语言:javascript复制#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
typedef int QDataType;
typedef struct QueueNode//队列节点的结构,即单链表节点的结构
{
QDataType data;
struct QueueNode* next;
}QNode;
typedef struct Queue//队列的结构,定义指向队列头尾的指针,以及队列节点的个数
{
QNode* phead;
QNode* ptail;
QDataType size;
}Q;
void QueueInit(Q*);
//入队列,队尾
void QueuePush(Q*, QDataType);
//出队列,队头
void QueuePop(Q*);
//队列判空
bool QueueEmpty(Q*);
//取队头数据
QDataType QueueFront(Q*);
//取队尾数据
QDataType QueueBack(Q*);
//队列有效元素个数
int QueueSize(Q*);
void QueueDestroy(Q*);
test.c
- 用来测试我们写的函数(函数的调用)
- 这一部分就是自己写的时候用的测试用例,随便什么都行
最好是写一个方法测试一次,不然找错误的时候会很痛苦