一、什么是队列
只允许在一端进行插入数据,在另一端进行删除数据的特殊的线性表。

二、队列的特点
1.队列是一种操作受限的线性表。
2.队头作为允许删除的一端。
3.队尾作为允许插入的一端。
4.没有元素的队列称为空队列。
三、队列的基本操作
1.队列的初始化
2.队列的判空操作
3.队列的入队操作
4.队列的出队操作
5.获取队列中的元素
7.计算队列中元素的个数
6.销毁队列
四、代码实现
以链式队列为例实现
1.Queue.h文件
typedef int QElemType;
//typedef struct BTNode* QElemType;
typedef struct QNode
{
        QElemType data;
        struct QNode *_pNext;
}QNode;
typedef struct LQueue
{
        QNode *pFront;
        QNode *pRear;
}LQueue;
//初始化
void LQueueInit(LQueue *q);
//入队列
void LQueuePush(LQueue *q, QElemType data);
//出队列
void LQueuePop(LQueue *q);
//返回队头元素
QElemType LQueueTop(LQueue *q);
//返回返回队列长度
int LQueueSize(LQueue *q);
//队列是否为空
int LQueueEmpty(LQueue *q);
//销毁队列
void LQueueDestroy(LQueue* q);
//打印队列
void LQueuePrint(const LQueue* q);2.Queue.c文件
//创建新结点
static QNode *BuyLQNode(QElemType data)
{
        QNode *pLQNode = (QNode *)malloc(sizeof(QNode));
        if (NULL == pLQNode)
        {
                printf("申请空间失败!\n");
                assert(pLQNode);
        }
        pLQNode->data = data;
        pLQNode->_pNext = NULL;
        return pLQNode;
}
void LQueueInit(LQueue *q)
{
        assert(q);
        q->pFront = q->pRear = NULL;
}
void LQueuePush(LQueue *q, QElemType data)
{
        assert(q);
        if (NULL == q->pFront)
        {
                q->pFront = q->pRear = BuyLQNode(data);
                return;
        }
        q->pRear->_pNext = BuyLQNode(data);
        q->pRear = q->pRear->_pNext;
}
void LQueuePop(LQueue *q)
{
        assert(q);
        QNode *pDel;
        if (NULL == q->pFront)
        {
                return;
        }
        }
        if (q->pFront == q->pRear)
        {
                q->pRear = NULL;
        }
        pDel = q->pFront;
        q->pFront = q->pFront->_pNext;
        free(pDel);
}
QElemType LQueueTop(LQueue *q)
{
        assert(q);
        return q->pFront->data;
}
QElemType LQueueBack(LQueue *q)
{
        assert(q);
        return q->pRear->data;
}
int LQueueSize(LQueue *q)
{
        int count = 0;
        QNode *pCur;
        assert(q);
        pCur = q->pFront;
        while (pCur)
        {
                pCur = pCur->_pNext;
                count++;
        }
        return count;
}
int LQueueEmpty(LQueue *q)
{
        return NULL == q->pFront;
}
void LQueueDestroy(LQueue* q)
{
  assert(q);
  QNode* pCur=q->pFront;
  while(pCur)
  {
    QNode* next=pCur->_pNext;
    free(pCur);
    pCur=next;
  }
  q->pFront=q->pRear=NULL;
}
void LQueuePrint(const LQueue* q)
{
        for(QNode* cur=q->pFront;cur!=NULL;cur=cur->_pNext)
        {
                printf("%d-->",cur->data);
        }
        printf("\n");
}3.test.c文件
include "Queue.h"
void menu() {
        printf("***********请输入你的操作  *************\n");
        printf("***********1.初始化队列    *************\n");
        printf("***********2.入队          *************\n");
        printf("***********3.出队          *************\n");
        printf("***********4.获取队列大小  *************\n");
        printf("***********5.查看队列元素  *************\n");
        printf("***********6.销毁队列      *************\n");
        printf("***********7.退出          *************\n");
        printf("\n");
}
int main() {
        LQueue q;
        int enEle = 0;
        int deEle = 0;
        int Qsize = 0;
        int ope=0;
        bool loop = true;
        while (loop) {
                menu();
                printf("请输入你的操作:");
                scanf("%d", &ope);
                switch (ope)
                {
                case 1:
                        LQueueInit(&q);
                        printf("初始化队列成功!\n");
                        break;
                case 2:
                        printf("输入入队元素:");
                        scanf("%d", &enEle);
                        LQueuePush(&q, enEle);
                        printf("入队成功!\n");
                        break;
                case 3:
                        printf("输入出队元素:");
                        scanf("%d", &deEle);
                        LQueuePop(&q);
                        printf("出队元素为:%d\n", deEle);
                        break;
                case 4:
                        Qsize = LQueueSize(&q);
                        printf("%d\n", Qsize);
                        break;
                case 5:
                        printf("队列的元素为:\n");
                        LQueuePrint(&q);
                        break;
                case 6:
                        LQueueDestroy(&q);
                        printf("销毁成功\n");
                        break;
                case 7:
                        loop = false;
                        printf("退出成功!\n");
                        break;
                default:
                        printf("输入不合理,请重新输入!\n");
                        break;
                }
        }
}4.makefile文件
src=$(wildcard *.c)
obj=$(patsubst %.c,%.o,$(src))
ALL:test
test:$(obj)
        gcc $^ -pthread -o $@
clean:
        -rm -rf $(obj) test
%.o:%.c
        gcc -c $< -o $@
.PHONY:clean ALL五、功能显示











