队列(循环队列)
队列是只允许在一端进行插入操作,在另一端进行删除操作的线性表。允许插入的一端称为队尾,允许删除的一端称为队头。
特性:先进先出。
循环队列
方式一:
队空:front==rear
队满:rear+1==front
所以需要浪费一个数组空间,例如:6个数组长度的队列,只能存放5个元素。
入队示意图
出队示意图
代码:
#include "stdafx.h"
const int QUEUESIZE = 6;
typedef int ElemType;
ElemType data[QUEUESIZE];
int front, rear;
void initQueue();
void enQueue(ElemType x);
int deQueue();
int getHead();
int main()
{
int x;
initQueue();
while (true)
{
if ((rear + 1) % QUEUESIZE != front)
{
printf("输入一个整数:");
scanf_s("%d", &x);
enQueue(x);
}
else
{
break;
}
}
printf("获取队头元素:%d\n", getHead());
while (true)
{
if (front != rear)
{
printf("%d已出队\n",deQueue());
printf("front:%d,rear:%d\n", front, rear);
}
else
{
break;
}
}
return 0;
}
//初始化队列
void initQueue()
{
//初始化一个空队列,将队头front和队尾rear同时指向数组某个位置,一般从高端开始
front = rear = QUEUESIZE - 1;
printf("初始化队列\n");
printf("front:%d,rear:%d\n", front, rear);
}
//入队操作,在队尾插入元素x
void enQueue(ElemType x)
{
if ((rear + 1) % QUEUESIZE == front) throw "上溢";
data[rear] = x;
rear = ++rear % QUEUESIZE;
printf("%d已入队\n",x);
printf("front:%d,rear:%d\n", front, rear);
}
//出队操作,删除队头元素
int deQueue()
{
int x = data[front];
if (front == rear) throw "下溢";
front = ++front % QUEUESIZE;
return x;
}
//获取队头元素
int getHead()
{
ElemType x;
x = data[front];
return x;
}
运行结果
方式二:
定义一个变量Len 记录队列的存储的数据的个数,入队和出队都进行判断的增减。
这样长度为6的循环队列可以存储6个数据
const int MaxSize = 6;
typedef int ElemType;
ElemType data[MaxSize];
void first();
int First, Rear;
int Len=0;
void initQueue();
void enQueue(ElemType x);
int deQueue();
int getHead();
typedef struct QUEUE
{
int First, Rear, Len;
CarType num[CarNum];
}Queue;
void first()
{
int x;
initQueue();
while (Len != 6)
{
printf("输入一个整数:");
scanf_s("%d", &x);
enQueue(x);
printf("Len=%d:\n", Len);
}
printf("获取队头元素:%d\n", getHead());
while (Len != 0)
{
printf("%d已出队\n", deQueue());
}
}
//初始化队列
void initQueue()
{
//初始化一个空队列,将队头front和队尾rear同时指向数组某个位置,一般从高端开始
First = Rear = MaxSize - 1;
printf("初始化队列\n");
//printf("First:%d,Rear:%d\n", First, Rear);
}
//入队操作,在队尾插入元素x
void enQueue(ElemType x)
{
if (Len == MaxSize) {
printf("队列已满,不能入队\n");
return;
}
data[Rear] = x;
Rear = ++Rear % MaxSize;//移动队尾指针
Len++;
printf("%d已入队\n", x);
//printf("First:%d,Rear:%d\n", First, Rear);
return;
}
//出队操作,删除队头元素
int deQueue()
{
if (Len == 0)
{
printf("队列已空,不能出队\n");
return -1;
}
int x = data[First];
//printf("x=%d\n",x);
First = ++First % MaxSize;//移动队头指针
Len--;
return x;
}
//获取队头元素
int getHead()
{
ElemType x;
x = data[First];
return x;
}
运行结果
发现有问题,麻烦评论区指出,共同学习进步。
如果对你有帮助的话点赞支持一下,谢谢