简单队列
在顺序队列中,通常让队尾指针rear指向刚进队的元素的位置,让队首指针front指向刚出队的元素的位置。因此,元素进队的时候rear指针要向后移动,元素出队的时候front指针也要向后移动。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define MAXSIZE 20
typedef int ElemType; // 定义类型
typedef struct QNode
{
ElemType data[MAXSIZE];
int Front;
int Rear;
} Queue;
void InitQueue(Queue *Q) // 初始化队列
{
Q->Front = 0;
Q->Rear = 0;
printf("队列初始化成功\n");
}
void ClearQueue(Queue *Q) // 清空队列
{
Q->Front = 0;
Q->Rear = 0;
printf("队列已经置空\n");
}
int EmptyQueue(Queue Q) // 判断队列是否为空
{
if (Q.Front == Q.Rear)
{
printf("队列是空的\n");
return 1;
}
else
{
printf("队列非空\n");
return 0;
}
}
int LengthQueue(Queue Q) // 求队列的长度
{
return (Q.Rear - Q.Front + MAXSIZE) % MAXSIZE;
}
void AddQueue(Queue *Q, ElemType e) // 入队操作
{
if ((Q->Rear + 1) % MAXSIZE == Q->Front) // 判断队列是否满
{
printf("队列是满的!!!\n");
}
Q->data[Q->Rear] = e; // 元素入队
Q->Rear = (Q->Rear + 1) % MAXSIZE; // 队尾向后移
}
void DeleteQueue(Queue *Q) // 出队操作
{
int t;
if (Q->Front == Q->Rear) // 判断队列是否为空
{
printf("队列是空的!!!\n");
}
t = Q->data[Q->Front]; // 元素出队
Q->Front = (Q->Front + 1) % MAXSIZE; // 队头后移
printf("删除元素%d\n", t);
}
void QueueTraverse(Queue Q) // 遍历队列
{
if (EmptyQueue(Q))
return;
int i = Q.Front;
while ((i + Q.Front) != Q.Rear)
{
printf("%d ", Q.data[i]);
i = (i + 1) % MAXSIZE;
}
printf("\n");
}
int main()
{
Queue Q;
InitQueue(&Q); // 队列初始化
EmptyQueue(Q); // 队列置空
int e;
int n;
printf("请输入你想要的添加几个元素:");
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
AddQueue(&Q, i);
}
printf("入队成功!!!");
int Len = LengthQueue(Q);
printf("队列的长度是%d\n", Len);
printf("队列的遍历为:");
QueueTraverse(Q);
printf("\n");
printf("现在开始出队!!!\n");
for (int i = 1; i <= n; i++)
{
DeleteQueue(&Q);
}
Len = LengthQueue(Q);
printf("此时队列的长度是%d\n", Len);
printf("再次添加元素\n");
for (int i = 1; i <= n; i++) //为了验证ClearQueue,再次添加
{
AddQueue(&Q, i);
}
Len = LengthQueue(Q);
printf("队列的长度是%d\n", Len);
ClearQueue(&Q); // 清空队列
Len = LengthQueue(Q);
printf("此时队列长度是%d\n", Len);
EmptyQueue(Q);
getchar();
getchar();
return 0;
}
循环队列
两个指针最终会到达数组的末端处,虽然队中已没有了元素,但是仍然无法插入元素,这就是所谓的“假溢出”。为了解决假溢出的问题,可以将数组弄成一个环状,让rear和front指针沿着环走,这样就不会出现无法继续走下去的情况,这样就产生了循环队列
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define Maxsize 20
//定义队列的结构体
typedef struct Squeue {
int data[Maxsize];
int front;
int rear;
}Squeue;
//初始化队列
void InitQueue(Squeue &qu)
{
qu.front = qu.rear = 0;
}
//判断队列是否为空
int isQueueEmpty(Squeue qu)
{
if (qu.front == qu.rear)
{
return 1;
}
else
{
return 0;
}
}
//元素入队操作
int inQueue(Squeue &qu, int x)
{
//若队满则无法入队
if ((qu.rear + 1) % Maxsize == qu.front)
{
return 0;
}
qu.rear = (qu.rear + 1) % Maxsize;
qu.data[qu.rear] = x;
return 1;
}
//元素出队操作
int deQueue(Squeue &qu, int &x)
{
//若队空则无法出队
if (qu.front == qu.rear)
{
return 0;
}
qu.front = (qu.front + 1) % Maxsize;
x = qu.data[qu.front];
return 1;
}
int main()
{
Squeue q;
int i, n, x, a;
InitQueue(q);
printf("请输入元素个数:");
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &a);
inQueue(q, a);
}
//当队列非空时,输出队列中所有数据
while (!isQueueEmpty(q))
{
deQueue(q, x);
printf("%d ", x);
}
getchar();
getchar();
return 0;
}