一、队列的介绍
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)
入队列:进行插入操作的一端称为队尾
出队列:进行删除操作的一端称为队头
二、队列的实现
1.试分析队列的结构体
同前文栈一样,队列也可以使用顺序表、链表两种结构实现,但使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。
三、完整源码
queue.h
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef int QueueDatatype;
typedef struct QueueNode
{
struct QueueNode* next;
QueueDatatype data;
}QNode;
typedef struct Queue
{
QNode* head;
QNode* tail;
int size;
}Queue;
//队列的初始化
void QueueInit(Queue* ps);
//队列的销毁
void QueueDestroy(Queue* ps);
//队列的入栈
void Queuepush(Queue* ps, QueueDatatype x);
//队列的出栈
void QueuePop(Queue* ps);
//查找队列头的值
QueueDatatype QueueTop(Queue* ps);
//查找队列是否为空
bool QueueEmpty(Queue* ps);
//队列打印
void Queueprintf(Queue* ps);
//队列查看大小
void Queuesize(Queue* ps);
//队列的查尾
QueueDatatype QueueBack(Queue* ps);
QNode* BuyQNode();
queue.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"queue.h"
QNode* BuyQNode()
{
QNode* tmp = (QNode*)malloc(sizeof(QNode));
if (tmp == NULL)
{
perror("malloc fail");
return NULL;
}
tmp->next = NULL;
tmp->data = 0;
return tmp;
}
//队列的初始化
void QueueInit(Queue* ps)
{
assert(ps);
ps->head = NULL;
ps->tail = NULL;
ps->size = 0;
}
//队列的入栈
void Queuepush(Queue* ps, QueueDatatype x)
{
assert(ps);
if (ps->head == NULL)
{
QNode* cur = BuyQNode();
cur->data = x;
ps->head = ps->tail = cur;
ps->size++;
}
else
{
QNode* cur = BuyQNode();
cur->data = x;
ps->tail->next = cur;
ps->tail = cur;
ps->size++;
}
}
//队列的出栈
void QueuePop(Queue* ps)
{
assert(ps);
assert(ps->head);
QNode* del = ps->head;
ps->head = ps->head->next;
free(del);
ps->size--;
}
//查找队列头的值
QueueDatatype QueueTop(Queue* ps)
{
assert(!QueueEmpty(ps));
return ps->head->data;
}
//查找队列是否为空
bool QueueEmpty(Queue* ps)
{
return ps->size == 0;
}
//队列查看大小
void Queuesize(Queue* ps)
{
return ps->size;
}
//队列的查尾
QueueDatatype QueueBack(Queue* ps)
{
assert(!QueueEmpty(ps));
return ps->tail->data;
}
//队列打印
void Queueprintf(Queue* ps)
{
//assert(ps);
QNode* cur = ps->head;
while (cur)
{
printf("%d ", cur->data);
cur = cur->next;
}
printf("\n");
}
//队列销毁
void QueueDestroy(Queue* ps)
{
assert(ps);
QNode* cur = ps->head;
while (cur)
{
QNode* next = cur->next;
free(cur);
cur = next;
}
ps->head = ps->tail = NULL;
ps->size = 0;
}
总结
个人对队列基本知识摘录总结以及其C语言代码的实现。
本文章为作者的笔记和心得记录,顺便进行知识分享,有任何错误请评论指点:)。