基本概念
概念:Queue是一种先进先出(First In Out,FIFO)的数据结构,它有两个开口
特点:队列容器允许从一端新增元素,从另一端移除元素
队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为
队列中进数据称为---入队push
队列中出数据成为---出队 pop
队列属于受线性表
生活中的队列:
队列的顺序存储
概念:
所谓队列的顺序存储,即利用数组模拟队列的先进先出的数据结构
题目描述
设计顺序存储队列容器,可以存放整形数据,并满足队列的特性
设计需求
队列对用户提供以下功能:
入队
出队
获取队头
获取队尾
获取队列大小
判断队列是否为空
思考:
数组的首地址端做队头还是队尾?
对于数组而言,不论首地址端做队头还是队尾,尾地址端都要选择另一个效率上没有什么太大差别这里我们采用首地址端做队头
队列循序存储 参考代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 1000
//队列的结构体
typedef struct Queue
{
int data[MAX]; //队列内部真实的结构、数组模拟
int size; //队列的大小
}Queue,*seqQueue;
//初始化队列
seqQueue init_seqQueue()
{
//分配内存空间
seqQueue queue = malloc(sizeof(struct Queue));
if (queue == NULL)
{
return NULL;
}
//初始化队列大小
queue->size = 0;
//清空队列中所有元素
for (int i = 0; i < MAX;i++)
{
queue->data[i] = 0;
}
return queue;
}
//入队
void push_seqQueue(seqQueue queue, int data)
{
//本质 -- 尾插
if (queue == NULL)
{
return;
}
if (queue->size == MAX)
{
printf("队列已满\n");
return;
}
queue->data[queue->size] = data;
//更新队列大小
queue->size++;
}
//出队
void pop_seqQueue(seqQueue queue)
{
//本质 头删
if (queue == NULL)
{
return;
}
if (queue->size == 0)
{
printf("空队,无法出队\n");
return;
}
for (int i = 0; i < queue->size - 1; i++)
{
queue->data[i] = queue->data[i + 1];
}
//更新数组大小
queue->size--;
}
//返回队头
int front_seqQueue(seqQueue queue)
{
if (queue == NULL)
{
return -1;
}
return queue->data[0];
}
//返回队尾
int back_seqQueue(seqQueue queue)
{
if (queue == NULL)
{
return -1;
}
return queue->data[queue->size - 1];
}
//队列大小
int size_seqQueue(seqQueue queue)
{
if (queue == NULL)
{
return -1;
}
return queue->size;
}
//判断是否为空
int isEmpty_seqQueue(seqQueue queue)
{
if (queue == NULL)
{
return -1;
}
if (queue->size == 0)
{
return 1;
}
return 0;
}
//销毁队列
void destroy_seqQueue(seqQueue queue)
{
if (queue != NULL)
{
free(queue);
queue = NULL;
}
}