目录
1 队列(queue)
顺序队列(循环队列) 和 链式队列
1.1 什么是队列?
只允许在两端进行插入和删除操作的线性表,在队尾插入,在队头删除 插入的一端,被称为"队尾",删除的一端被称为"队头"
在队列操作过程中,为了提高效率,以调整指针代替队列元素的移动,并将数组作为循环队列的操作空间。
1.2 队列的特点
先进先出 FIFO first in first out
后进后出 LILO last
1.3 举例:
去银行办理业务,需要排队,有个先来后到,先来的先办业务
1.4 队列的操作
(1)创建一个空的队列
#define N 5
typedef int datatype;
typedef struct
{
datatype data[N];
int rear; //存数据端 rear 后面
int front; //取数据端 front 前面
}sequeue_t;//sequence 顺序 queue队列
(2)入列
(3)出列
(4)判断队列是否为空
(5)判断队列是否为满
(6)求队列的长度
(7)清空队列
2. 顺序队列(又称为循环队列)
逻辑结构: 线性结构
存储结构:顺序存储结构
#define N 5
typedef int datatype;
typedef struct
{
datatype data[N];
int rear; //存数据端 rear 后面
int front; //取数据端 front 前面
}sequeue_t;//sequence 顺序 queue队列
*********************重点**************************************************
循环队列中,假设数组的元素个数为N,那么循环队列中存储最多的数据个数为N-1个
原因:思想上,舍去数组上的一个存储位置,用于判断队列是否为满,先判断rear的下一个位置是否等于front
return (p->rear+1) % N == p->front;
***************************************************************************
///
循环队列,如果数组的元素个数为N,那么队列中最多能够存储的数据数的多少? N-1个
为什么?
rear 后面 队尾,在插入的时候,插入之前需要先判断 rear+1,
也就是他的下一个为位置是否 等于 front 来判断队列是否为满,会造成浪费一个存储位置
/
3. 顺序队列相关操作函数
#include <stdio.h>
#include <stdlib.h>
#define N 5
typedef int datatype;
typedef struct
{
datatype data[N];//循环队列的数组
int rear;//存数据端 rear 后面
int front;//取数据端 front 前面
}sequeue_t;
//1.创建一个空的队列
sequeue_t *CreateEmptySequeue();
//2.入列 data代表入列的数据
int InSequeue(sequeue_t *p,datatype data);
//3.判断队列是否为满
int IsFullSequeue(sequeue_t *p);
//4.判断队列是否为空
int IsEmptySequeue(sequeue_t *p);
//5.出列
datatype OutSequeue(sequeue_t *p);
//6.求队列的长度
int LengthSequeue(sequeue_t *p);
//7.清空队列函数
void ClearSequeue(sequeue_t *p);
注重理解与实现过程,多敲多练!