在生活中我们经常会遇到排队的事情,比如说排队买东西,大家依次站一个队,队头的人要比后面的人先买到东西,先到先得,然后买完东西就会离开这个队
而我们平时为了解决在比如说打客服电话,排队叫号之类的应用问题时我们就应用了 队列 这种数据结构,实现先到先得,先入先出的排队功能
队列(Queue):是只允许在一端进行插入操作,在另一端进行删除操作的线性表。
队列也是一种特殊的线性表,是一种先进先出的线性表。允许插入的一端称为表尾(队尾),允许删除的一端称为表头(队头)。
基于队列只能在队尾插入,只能在队头删除的特性,使用链表来实现队列相比于顺序表更为合适,所以我们用单链表来实现队列
其次我们使用单链表来实现队列就要定义对内元素结点
typedef
int
DataType
;
typedef
struct
QueueNode
{
DataType
_data;
struct
QueueNode
* _next;
}
QueueNode
;
其次定义队列的结构体,包括两个指针_head和_tail分别指向队头和队尾和一个size来记录当前队列里面元素个数
typedef
struct
Queue
{
QueueNode
* _head;
//队头
QueueNode
* _tail;
//队尾
size_t
_size;
}
Queue
;
接着就是相关操作函数接口的声明
QueueNode
* BuyNewQueueNode(
DataType
x
);
//创建新的结点
void
QueueInit(
Queue
*
q
);
//队列的初始化
void
QueuePush(
Queue
*
q
,
DataType
x
);
//入队
void
QueuePop(
Queue
*
q
);
//出队
DataType
QueueFront(
Queue
*
q
);
//队头元素
DataType
QueueBack(
Queue
*
q
);
//队尾元素
size_t
QueueSize(
Queue
*
q
);
//队内元素个数
int
QueueEmpty(
Queue
*
q
);
//清空队
以上这些可以放在
QueueNode .h
中进行定义、声明
在QueueNode .c中对相关函数接口进行定义实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"QueueNode .h"
QueueNode* BuyNewQueueNode(DataType x)//创建新的结点
{
QueueNode* tmp = (QueueNode*)malloc(sizeof(QueueNode));
if (tmp != NULL)
{
tmp->_data = x;
tmp->_next = NULL;
return tmp;
}
return NULL;
}
void QueueInit(Queue* q)//队列的初始化
{
q->_head = NULL;
q->_tail = NULL;
q->_size = 0;
}
void QueuePush(Queue* q, DataType x)//入队
{
assert(q);
QueueNode* NewNode = BuyNewQueueNode(x);
if (q->_size == 0)
{
q->_head = NewNode;
q->_tail = NewNode;
q->_size++;
}
else
{
q->_tail->_next = NewNode;
q->_tail = NewNode;
q->_size++;
}
}
void QueuePop(Queue* q)//出队
{
assert(q);
if (q->_size == 0)
{
printf("队列为空,无可出队元素!!\n");
return;
}
if (q->_size == 1)
{
free(q->_head);
q->_head = NULL;
q->_tail = NULL;
q->_size--;
return;
}
else
{
QueueNode* cur = q->_head->_next;
free(q->_head);
q->_head = cur;
q->_size--;
return;
}
}
DataType QueueFront(Queue* q)//队头元素
{
assert(q&&q->_head);
return q->_head->_data;
}
DataType QueueBack(Queue* q)//对尾元素
{
assert(q&&q->_tail);
return q->_tail->_data;
}
size_t QueueSize(Queue* q)//队内元素个数
{
assert(q);
return q->_size;
}
int QueueEmpty(Queue* q)//清空队列
{
assert(q);
if (q->_size == 0)
{
return 0;
}
else
{
QueueNode* cur = q->_head->_next;
while (q->_head != q->_tail)
{
free(q->_head);
q->_head = cur;
cur = cur->_next;
}
free(q->_head);
q->_head = NULL;
q->_tail = NULL;
q->_size = 0;
return 0;
}
}
int main()
{
Queue q;
QueueInit(&q);
QueuePush(&q, 1);
QueuePush(&q, 2);
QueuePush(&q, 3);
QueuePush(&q, 4);
QueuePush(&q, 5);
QueuePop(&q);
printf("队首元素为:%d\n", QueueFront(&q));
printf("队尾元素为:%d\n", QueueBack(&q));
printf("队内元素个数为:%d\n", QueueSize(&q));
system("pause");
return 0;
}
对于main函数中的测试用例进行简单测试
本文介绍了如何使用单链表实现队列数据结构,包括队列的定义、基本操作如入队、出队、查看队头和队尾元素、获取队列大小以及清空队列的方法。通过示例代码展示了队列操作的实现过程。
的实现及简单操作&spm=1001.2101.3001.5002&articleId=79825838&d=1&t=3&u=fa6cc8c2e31f4f25b163071b298a55ac)
685

被折叠的 条评论
为什么被折叠?



