目录
1. 队列的概念
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有**先进先出FIFO(First In First Out)。
入队列:进行插入操作的一端称为队尾 。
出队列:进行删除操作的一端称为队头.
2.循环队列一一队列的顺序表示和实现
用一组地址连续的存储单元依次存放从队列头到队列尾的元素之外,尚需附设两个整型变量 front 和 rear分别指示队列头元素及队列尾元素的位置(后面分别称为头指针和尾指针)。
2.1队列的顺序存储结构
#define MAXQSIZE 100 //队列可能达到的最大长度
typedef struct
{
QElemType *base; //存储空间的基地址
int front; //头指针
int rear; //尾指针
} SqQueue;
3.代码演示
#include <stdio.h>
#include <limits.h>
typedef int ElemType;//定义数据类型
//**********循环队列开始**********
#define MAXSIZE 5//初始容量
typedef struct{
ElemType data[MAXSIZE];
int front;//头指针
int rear;//尾指针,队列非空时,指向队尾元素下个位置
}SQueue;
void InitQueue(SQueue& Q){
Q.front = Q.rear = 0;
}//将列队清空
bool QueueFull(const SQueue& Q){
//TODO: 实现判断循环 队列是否为满的的代码。
return (Q.rear + 1) % MAXSIZE == Q.front;//加一取模
}
bool QueueEmpty(const SQueue& Q){
//TODO: 实现判断循环队列是否为空的的代码。
return Q.front == Q.rear;//当队列为空时front 和rear相等
}
void EnQueue(SQueue& Q, ElemType x){
if (QueueFull(Q))
//是否为空队列
{
printf("队列已满! 元素%d入队失败!\n", x);
return;
}
//TODO: 实现循环队列入队的代码
Q.rear = (Q.rear + 1) % MAXSIZE;//尾部指针后移,如到最后转到头部
Q.data[Q.rear] = x;//插入队尾
}
ElemType DeQueue(SQueue& Q){
if (QueueEmpty(Q)){
printf("队列已空! 出队失败!\n");
return INT_MAX;
}
//TODO: 实现循环队列出队的代码
Q.front = (Q.front + 1) % MAXSIZE;//队头指针后移,如到在最后转到头部
ElemType x = Q.data[Q.front];
return x;
}
int QueueSize(const SQueue& Q){
return Q.rear >= Q.front ? Q.rear - Q.front : Q.rear - Q.front + MAXSIZE;
}//返回列队中元素个数
//**********循环队列结束**********
int main(){
//循环队列的操作
SQueue Q1;
InitQueue(Q1);
EnQueue(Q1, 1);
printf("队首元素为:%d, 并出队\n", DeQueue(Q1));
EnQueue(Q1, 2);
EnQueue(Q1, 3);
EnQueue(Q1, 4);
EnQueue(Q1, 5);
EnQueue(Q1, 6);
printf("队首元素为:%d, 并出队\n", DeQueue(Q1));
EnQueue(Q1, 6);
printf("队首元素为:%d, 并出队\n", DeQueue(Q1));
printf("队列元素个数为:%d\n", QueueSize(Q1));
printf("队首元素为:%d, 并出队\n", DeQueue(Q1));
printf("队首元素为:%d, 并出队\n", DeQueue(Q1));
printf("队首元素为:%d, 并出队\n", DeQueue(Q1));
printf("队首元素为:%d, 并出队\n", DeQueue(Q1));
printf("\n");
return 0;
}
4.运行调试