队列:一种可以实现“先进先出”的存储结构
目录
一、循环队列是什么?
二、循环队列的插入与删除
1.循环队列的结构
2.循环队列的初始化
3.循环队列的插入(入队)
4.循环队列的删除(出队)
5.打印循环队列
6.主函数
7.完整代码
8.编码结果
总结
一、循环队列是什么?
循环队列就好比我们乘坐公交车,当我们上车发现车后面坐满了而前面还有空座的时候,肯定不是说下车等下一俩,而是后面没座了那我就坐前面呗,循环队列解决的就是这样一个问题。因此我们将队列头尾相接的顺序存储结构称为循环队列
二、循环队列的插入与删除
1.循环队列的结构
typedef int QElemType; //QElemType根据实际情况输入的元素而定,这里假设为int
//定义一个队列(顺序存储)
typedef struct Queue
{
QElemType data[MAXSZIE]; //静态存储
int front; //指向队头元素
int rear; //指向队尾元素
}Queue;
2.循环队列的初始化
//初始化一个循环队列
Queue* InitQueue()
{
Queue *Q=(Queue*)malloc(sizeof(Queue)); //为循环队列开辟一个动态存储空间
Q->front=0;
Q->rear=0; //设置为空队列
return Q;
}
3.循环队列的插入(入队)
//循环队列的插入
void enQueue(Queue* Q,QElemType data)
{
if((Q->rear+1)%MAXSZIE==Q->front) //对队列是否满进行操作
{
printf("队列已满,无法进行插入操作\n");
}
Q->data[Q->rear]=data;
Q->rear=(Q->rear+1)%MAXSZIE;
}
4.循环队列的删除(出队)
//循环队列的出队
QElemType deQueue(Queue *Q)
{
if(Q->front==Q->rear) //判断队列是否为空
{
printf("队列为空,无法进行删除操作\n");
}
int e=Q->data[Q->front]; //将删除的元素保留到data中
Q->front=(Q->front+1)%MAXSZIE; //将指向第一个元素的指针向后一位
return e;
}
5.打印循环队列
//打印队列
void printQueue(Queue *Q)
{
int index=Q->front;
for(int i=0;i<QueueLength(Q);i++)
{
printf("%d->",Q->data[index]);
index=(index+1)%MAXSZIE;
}
printf("NULL");
}
6.主函数
int main()
{
Queue *Q=InitQueue();
enQueue(Q,17);
enQueue(Q,5);
enQueue(Q,2);
enQueue(Q,0);
enQueue(Q,33);
printQueue(Q);
int num=deQueue(Q);
printf("\n删除的元素为:%d\n",num);
printQueue(Q);
return 0;
}
7.完整代码
#include<stdio.h>
#include<stdlib.h>
#define MAXSZIE 10 //定义最大数组长度为10
typedef int QElemType; //QElemType根据实际情况输入的元素而定,这里假设为int
//定义一个队列(顺序存储)
typedef struct Queue
{
QElemType data[MAXSZIE];
int front; //指向队头元素
int rear; //指向队尾元素
}Queue;
//初始化一个循环队列
Queue* InitQueue()
{
Queue *Q=(Queue*)malloc(sizeof(Queue)); //为循环队列开辟一个动态存储空间
Q->front=0;
Q->rear=0; //设置为空队列
return Q;
}
//当前队列的长度
int QueueLength(Queue *Q)
{
return (Q->rear-Q->front+MAXSZIE)%MAXSZIE; //计算队列长度的公式
}
//循环队列的插入
void enQueue(Queue* Q,QElemType data)
{
if((Q->rear+1)%MAXSZIE==Q->front) //对队列是否满进行操作
{
printf("队列已满,无法进行插入操作\n");
}
Q->data[Q->rear]=data;
Q->rear=(Q->rear+1)%MAXSZIE;
}
//循环队列的出队
QElemType deQueue(Queue *Q)
{
if(Q->front==Q->rear) //判断队列是否为空
{
printf("队列为空,无法进行删除操作\n");
}
int e=Q->data[Q->front]; //将删除的元素保留到data中
Q->front=(Q->front+1)%MAXSZIE; //将指向第一个元素的指针向后一位
return e;
}
//打印队列
void printQueue(Queue *Q)
{
int index=Q->front;
for(int i=0;i<QueueLength(Q);i++)
{
printf("%d->",Q->data[index]);
index=(index+1)%MAXSZIE;
}
printf("NULL");
}
int main()
{
Queue *Q=InitQueue();
enQueue(Q,17);
enQueue(Q,5);
enQueue(Q,2);
enQueue(Q,0);
enQueue(Q,33);
printQueue(Q);
int num=deQueue(Q);
printf("\n删除的元素为:%d\n",num);
printQueue(Q);
return 0;
}
8.编码结果
总结
队尾指针是rear,队头是front,其中QueueSize为循环队列的最大长度
1.队空条件:rear==front
2.队满条件:(rear+1) %QueueSIze==front
3.计算队列长度:(rear-front+QueueSize)%QueueSize
4.入队:(rear+1)%QueueSize
5.出队:(front+1)%QueueSize