今天,我带了队列的实现代码总结。
目录
队列的概念
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出
FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 。出队列:进行删除操作的一端称为队头
队列实现的三个文档
Queue.h--------头文件的引用和函数的声明
Queue.c--------函数的定义
test.c--------栈的代码实现的检验
初始化函数
//初始化函数
void InitQueue(Queue* ps)
{
assert(ps);
ps->Head = NULL;
ps->Tail = NULL;
ps->size = 0;
}
销毁函数
//销毁函数
void DestroyQueue(Queue* ps)
{
assert(ps);
QueueNode* cur = ps->Head;
while (cur != NULL)
{
QueueNode* Next = cur->next;
free(cur);
cur = Next ;
}
ps->Head = ps->Tail = NULL;
ps->size = 0;
}
入队列函数
//入队列
void QueuePush(Queue* ps, QDataType x)
{
assert(ps);
QueueNode* NewNode = (QueueNode*)malloc(sizeof(QueueNode));
if (NewNode == NULL)
{
perror("QueuePush()");
exit(1);
}
NewNode->val = x;
NewNode->next = NULL;
if (ps->Tail == NULL)
{
ps->Head = ps->Tail = NewNode;
}
else
{
ps->Tail->next = NewNode;
ps->Tail = ps->Tail->next;
}
ps->size++;
}
出队列函数
//出队列
void QueuePop(Queue* ps)
{
assert(ps);
assert(!QueueEmpty(ps));
if(ps->Head->next == NULL)
{
free(ps->Head);
ps->Head = ps->Tail = NULL;
}
else
{
QueueNode* Next = ps->Head->next;
free(ps->Head);
ps->Head = Next;
}
ps->size--;
}
查看队头函数
//查看队头数据
QDataType QueueFront(Queue* ps)
{
assert(ps);
assert(!QueueEmpty(ps));
return ps->Head->val;
}
查看队尾函数
//查看队尾数据
QDataType QueueBack(Queue* ps)
{
assert(ps);
assert(!QueueEmpty(ps));
return ps->Tail->val;
}
统计队列的数据个数
//统计队列的数据个数
int QueueSize(Queue* ps)
{
assert(ps);
return ps->size;
}
判断队列是否为空的函数
//判断队列是否为空
bool QueueEmpty(Queue* ps)
{
assert(ps);
return ps->size == 0;
}
头文件的声明和函数的定义
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int QDataType;
typedef struct QueueNode
{
QDataType val;
struct QueueNode* next;
}QueueNode;
typedef struct Queue
{
QueueNode* Head;
QueueNode* Tail;
int size;
}Queue;
//初始化函数
void InitQueue(Queue* ps);
//销毁函数
void DestroyQueue(Queue* ps);
//入队列
void QueuePush(Queue* ps, QDataType x);
//出队列
void QueuePop(Queue* ps);
//查看队尾数据
QDataType QueueBack(Queue* ps);
//查看队头数据
QDataType QueueFront(Queue* ps);
//统计队列的数据个数
int QueueSize(Queue* ps);
//判断队列是否为空
bool QueueEmpty(Queue* ps);
菜单的实现和函数的调用
void menu()
{
printf("*************************************************************\n");
printf("*** 1.入列 2.出列 ***\n");
printf("*** 3.查看队头数据 4.查看队尾数据 ***\n");
printf("*** 5.统计队列数据个数 6.判断队列是否为空 ***\n");
printf("*** 0.退出 ***\n");
printf("*************************************************************\n");
}
int main()
{
int input = 0;
int num = 0;
Queue q;
InitQueue(&q);
do
{
menu();
printf("请选择:>\n");
scanf("%d",&input);
switch (input)
{
case 1:
printf("请输入你要入列的数据\n");
scanf("%d",&num);
QueuePush(&q,num);
break;
case 2:
QueuePop(&q);
break;
case 3:
printf("%d\n",QueueFront(&q));
break;
case 4:
printf("%d\n", QueueBack(&q));
break;
case 5:
printf("%d\n", QueueSize(&q));
break;
case 6:
if (QueueEmpty(&q) != true)
{
printf("队列非空\n");
}
else
{
printf("队列为空\n");
}
break;
case 0:
DestroyQueue(&q);
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
return 0;
}
Queue.c文档的代码
#include "Queue.h"
//初始化函数
void InitQueue(Queue* ps)
{
assert(ps);
ps->Head = NULL;
ps->Tail = NULL;
ps->size = 0;
}
//销毁函数
void DestroyQueue(Queue* ps)
{
assert(ps);
QueueNode* cur = ps->Head;
while (cur != NULL)
{
QueueNode* Next = cur->next;
free(cur);
cur = Next ;
}
ps->Head = ps->Tail = NULL;
ps->size = 0;
}
//入队列
void QueuePush(Queue* ps, QDataType x)
{
assert(ps);
QueueNode* NewNode = (QueueNode*)malloc(sizeof(QueueNode));
if (NewNode == NULL)
{
perror("QueuePush()");
exit(1);
}
NewNode->val = x;
NewNode->next = NULL;
if (ps->Tail == NULL)
{
ps->Head = ps->Tail = NewNode;
}
else
{
ps->Tail->next = NewNode;
ps->Tail = ps->Tail->next;
}
ps->size++;
}
//出队列
void QueuePop(Queue* ps)
{
assert(ps);
assert(!QueueEmpty(ps));
if(ps->Head->next == NULL)
{
free(ps->Head);
ps->Head = ps->Tail = NULL;
}
else
{
QueueNode* Next = ps->Head->next;
free(ps->Head);
ps->Head = Next;
}
ps->size--;
}
//查看队尾数据
QDataType QueueBack(Queue* ps)
{
assert(ps);
assert(!QueueEmpty(ps));
return ps->Tail->val;
}
//查看队头数据
QDataType QueueFront(Queue* ps)
{
assert(ps);
assert(!QueueEmpty(ps));
return ps->Head->val;
}
//统计队列的数据个数
int QueueSize(Queue* ps)
{
assert(ps);
return ps->size;
}
//判断队列是否为空
bool QueueEmpty(Queue* ps)
{
assert(ps);
return ps->size == 0;
}
Queue.h文档的代码
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int QDataType;
typedef struct QueueNode
{
QDataType val;
struct QueueNode* next;
}QueueNode;
typedef struct Queue
{
QueueNode* Head;
QueueNode* Tail;
int size;
}Queue;
//初始化函数
void InitQueue(Queue* ps);
//销毁函数
void DestroyQueue(Queue* ps);
//入队列
void QueuePush(Queue* ps, QDataType x);
//出队列
void QueuePop(Queue* ps);
//查看队尾数据
QDataType QueueBack(Queue* ps);
//查看队头数据
QDataType QueueFront(Queue* ps);
//统计队列的数据个数
int QueueSize(Queue* ps);
//判断队列是否为空
bool QueueEmpty(Queue* ps);
test.c文档的代码
#include "Queue.h"
void menu()
{
printf("*************************************************************\n");
printf("*** 1.入列 2.出列 ***\n");
printf("*** 3.查看队头数据 4.查看队尾数据 ***\n");
printf("*** 5.统计队列数据个数 6.判断队列是否为空 ***\n");
printf("*** 0.退出 ***\n");
printf("*************************************************************\n");
}
int main()
{
int input = 0;
int num = 0;
Queue q;
InitQueue(&q);
do
{
menu();
printf("请选择:>\n");
scanf("%d",&input);
switch (input)
{
case 1:
printf("请输入你要入列的数据\n");
scanf("%d",&num);
QueuePush(&q,num);
break;
case 2:
QueuePop(&q);
break;
case 3:
printf("%d\n",QueueFront(&q));
break;
case 4:
printf("%d\n", QueueBack(&q));
break;
case 5:
printf("%d\n", QueueSize(&q));
break;
case 6:
if (QueueEmpty(&q) != true)
{
printf("队列非空\n");
}
else
{
printf("队列为空\n");
}
break;
case 0:
DestroyQueue(&q);
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
return 0;
}
今天,队列实现代码总结就到这里,关注点一点,下期更精彩。