数据结构之 队列(Queue)的实现及简单操作

本文介绍了如何使用单链表实现队列数据结构,包括队列的定义、基本操作如入队、出队、查看队头和队尾元素、获取队列大小以及清空队列的方法。通过示例代码展示了队列操作的实现过程。
在生活中我们经常会遇到排队的事情,比如说排队买东西,大家依次站一个队,队头的人要比后面的人先买到东西,先到先得,然后买完东西就会离开这个队
而我们平时为了解决在比如说打客服电话,排队叫号之类的应用问题时我们就应用了 队列 这种数据结构,实现先到先得,先入先出的排队功能
队列(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函数中的测试用例进行简单测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值