什么是队列:
队列和栈一样,也是一种对数据的"存"和"取"有严格要求的线性存储结构。与栈结构不
同的是,队列的两端都"开口",要求数据只能从一端进,从另一端出。
![](https://img-blog.csdnimg.cn/img_convert/7cb8a63a779df0a1a04875f56408c61b.png)
![](https://img-blog.csdnimg.cn/img_convert/d2b138593a9c8676e60dfa97a274c6be.gif)
![](https://img-blog.csdnimg.cn/img_convert/35e30ea4570bdd39d58f4f133e6f3ff0.gif)
队列的特点:
队列是一种特殊的“一对一关系”的线性表,要求“一端存数据,另一端取数据”,并且遵循“先进先出”原则的线性存储结构。
队列顺序存储:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 1000
//队列的结构体
typedef struct Queue
{
int data[MAX]; //队列内部真实的结构、数组模拟
int size; //队列的大小
}Queue,*seqQueue;
//初始化队列
seqQueue init_seqQueue()
{
//分配内存空间
seqQueue queue = malloc(sizeof(struct Queue));
if (queue == NULL)
{
return NULL;
}
//初始化队列大小
queue->size = 0;
//清空队列中所有元素
for (int i = 0; i < MAX;i++)
{
queue->data[i] = 0;
}
return queue;
}
//入队
void push_seqQueue(seqQueue queue, int data)
{
//本质 -- 尾插
if (queue == NULL)
{
return;
}
if (queue->size == MAX)
{
printf("队列已满\n");
return;
}
queue->data[queue->size] = data;
//更新队列大小
queue->size++;
}
//出队
void pop_seqQueue(seqQueue queue)
{
//本质 头删
if (queue == NULL)
{
return;
}
if (queue->size == 0)
{
printf("空队,无法出队\n");
return;
}
for (int i = 0; i < queue->size - 1; i++)
{
queue->data[i] = queue->data[i + 1];
}
//更新数组大小
queue->size--;
}
//返回队头
int front_seqQueue(seqQueue queue)
{
if (queue == NULL)
{
return -1;
}
return queue->data[0];
}
//返回队尾
int back_seqQueue(seqQueue queue)
{
if (queue == NULL)
{
return -1;
}
return queue->data[queue->size - 1];
}
//队列大小
int size_seqQueue(seqQueue queue)
{
if (queue == NULL)
{
return -1;
}
return queue->size;
}
//判断是否为空
int isEmpty_seqQueue(seqQueue queue)
{
if (queue == NULL)
{
return -1;
}
if (queue->size == 0)
{
return 1;
}
return 0;
}
//销毁队列
void destroy_seqQueue(seqQueue queue)
{
if (queue != NULL)
{
free(queue);
queue = NULL;
}
}
队列的链式存储:
入队:
![](https://img-blog.csdnimg.cn/img_convert/3592ca429712d3d21d71a105c17760ea.png)
出队:
![](https://img-blog.csdnimg.cn/img_convert/0bff95cef5ad207d574f59846b083c8a.png)
队列链式存储:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//结点结构体
struct Node
{
int data; //数据域
struct Node* next; //指针域
};
//队列的结构体
typedef struct LQueue
{
struct Node header; //头结点
int size; //队列大小
struct Node* pTail; //尾结点指针
}LQueue, *LinkQueue;
//初始化队列
LinkQueue init_LinkQueue()
{
//创建队列结构体
struct LQueue* myQueue = (struct LQueue*)malloc(sizeof(struct LQueue));
if (myQueue == NULL)
{
return NULL;
}
//初始化队列
myQueue->size = 0;
myQueue->header.next = NULL;
myQueue->pTail = &myQueue->header;
return myQueue;
}
//入队
void push_LinkQueue(LinkQueue queue, int data)
{
//本质 尾插
if (queue == NULL)
{
return;
}
//新结点
struct Node * newNode = (struct Node *)malloc(sizeof(struct Node));
if (!newNode)
{
return;
}
newNode->data = data;
//更新指针的指向
queue->pTail->next = newNode;
newNode->next = NULL;
queue->pTail = newNode;
//更新队列大小
queue->size++;
}
//出队
void pop_LinkQueue(LinkQueue queue)
{
//本质 头删
if (queue == NULL)
{
return;
}
if (queue->size == 0)
{
printf("空队,无法出队\n");
return;
}
//记录第一个结点
struct Node* pFirst = queue->header.next;
//更新指针的指向
queue->header.next = pFirst->next;
//释放结点
if (pFirst != NULL)
{
free(pFirst);
}
//队列中只有一个结点的时候,再出队会影响尾指针,需要特判
if (queue->size == 1)
{
queue->pTail = &queue->header;
}
//队列大小更新
queue->size--;
}
//返回队头
int front_LinkQueue(LinkQueue queue)
{
if (queue == NULL)
{
return -1;
}
return queue->header.next->data;
}
//返回队尾
int back_LinkQueue(LinkQueue queue)
{
if (queue == NULL)
{
return -1;
}
return queue->pTail->data;
}
//返回队列大小
int size_LinkQueue(LinkQueue queue)
{
if (queue == NULL)
{
return -1;
}
return queue->size;
}
//判断是否为空
int isEmpty_LinkQueue(LinkQueue queue)
{
if (queue == NULL)
{
return -1;
}
if (queue->size == 0)
{
return 1;
}
return 0;
}
//销毁队列
void destroy_LinkQueue(LinkQueue queue)
{
if (queue != NULL)
{
free(queue);
queue = NULL;
}
}