C语言环形队列的实现
循环队列与普通队列相比,最主要的就是头与尾连接在一起,即front = rear = 0
队列中有效数据个数:(rear+MAXQSIZE-front)%MAXQSIZE
由于队列为环形,当需要计算队列长度时若队头在队尾前则为
lenth = rear - front
但若出现队尾在队头前按照原有计算方法会出现负值,显然是不符合要求的
此时大家会想到要是可以使用类似数学中的取绝对值操作,没错!
此时可以使用与取绝对值相同的操作但换了一个名字:取模
(rear+MAXQSIZE-front)%MAXQSIZE
此方法可以保证获得的是一个符合要求的队列长度
完整代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef int QElemType;
typedef int Status;
#define OK 1
#define ERROR 0
#define MAXQSIZE 10 //队列所能达到的最大长度
//创建一个队列
typedef struct {
QElemType data[MAXQSIZE];//队列的深度
int front; //头指针(数组下标)
int rear; //尾指针(数组下标)
}SqQueue;
//队列初始化
Status InitQueue(SqQueue& Q)
{
Q.front = Q.rear = 0; //首尾相连的环形队列
printf("空队列已经创建\n");
return OK;
}
//求队列长度
int QueueLength(SqQueue Q)
{
return (Q.rear + MAXQSIZE - Q.front) % MAXQSIZE; //取模
}
//入队
Status EnQueue(SqQueue& Q, QElemType e)
{
if ((Q.rear + 1) % MAXQSIZE == Q.front) //队满
{
printf("队满,无法执行此操作\n");
return ERROR;
}
Q.data[Q.rear] = e; //新元素入队列
Q.rear = (Q.rear + 1) % MAXQSIZE; //队尾向后一位
}
//出队
Status DeQueue(SqQueue& Q, QElemType& e)
{
if (Q.front == Q.rear) {
printf("队列为空,无法执行此操作\n");
return ERROR;
}
e = Q.data[Q.front]; //保存队列头元素到e
Q.front = (Q.front + 1) % MAXQSIZE; //队头向后一位
printf("已成功入队\n");
printf("出队元素:%d", e);
return OK;
}
//取队头
QElemType GetHead(SqQueue Q) {
if (Q.front == Q.rear) {
printf("队列中无元素,将输出默认元素0\n");
return ERROR;
}
return Q.data[Q.front];
}
//展示队列
Status ShowQueue(SqQueue Q) {
int n = Q.front + (Q.rear + MAXQSIZE - Q.front) % MAXQSIZE;
if (n == 0) {
printf("队列空,无法展示\n");
return ERROR;
}
else {
for (int i = Q.front; i < n; i++) {
printf("arr[%d]:%d\n", i % MAXQSIZE, Q.data[i % MAXQSIZE]);
}
return OK;
}
}
int main() {
SqQueue Q;
int flag = 0;
int n = 0;
int l = 0;
int h = 0;
int gt = 0;
bool loop = true;
InitQueue(Q);
while (loop) {
printf("请操作\n");
printf("1(Enter):入队\n");
printf("2(Delete):出队\n");
printf("3(Length):队列当前长度\n");
printf("4(Get):取队首元素\n");
printf("5(Show):展示队列\n");
printf("6(exit):退出程序\n");
scanf_s("%d", &flag);
switch (flag) {
case 1:
printf("请输入入队元素\n");
scanf_s("%d", &n);
EnQueue(Q, n);
printf("已成功入队\n");
break;
case 2:
DeQueue(Q, n);
printf("已成功出队\n");
break;
case 3:
l = QueueLength(Q);
printf("队列当前长度为:%d\n", l);
break;
case 4:
h = GetHead(Q);
printf("队首元素为:%d\n", h);
break;
case 5:
printf("展示队列:\n");
ShowQueue(Q);
break;
case 6:
loop = false;
break;
}
}
return 0;
}