/*
循环队列
队首指针 front 队尾指针 rear
1.初始化:front = 0 rear = 0
2.队列为空: front = rear
3.队满:(rear + 1) % MaxSize == front
4.入队:将新元素插入rear位置,然后rear+1
5.出队:删除front所指的元素,然后加1并返回被删除元素
6.取队首元素:返回front指向的元素值
*/
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10 // 队列最大容量
typedef int DataType; //队列中的元素类型
typedef struct Queue{
DataType Queue[MaxSize];
int front;
int rear;
}Queue;
//初始化队列
void InitQueue(Queue *Q){
Q->front=Q->rear=0;
}
//判断队列是否为空
int IsEmpty(Queue *Q){
if(Q->front== Q->rear){
printf("队列为空!\n");
return 1;
}
return 0;
}
// 判断队列是否为满
int IsFull(Queue *Q){
//尾指针+1追上队头指针,队列已满
if((Q->rear +1)%MaxSize == Q->front){
printf("队列已满!\n");
return 1;
}
return 0;
}
// 入队操作
int EnQueue(Queue *Q,DataType e){
if(IsFull(Q)){
printf("队列已满,不能入队!\n");
return 0;
}
Q->Queue[Q->rear] = e;
Q->rear = (Q->rear+1)%MaxSize; //重新设置队尾指针
}
// 出队操作
void DeQueue(Queue *Q,DataType *e){
if(IsEmpty(Q)){
printf("队列为空!\n");
}
*e = Q->Queue[Q->front];
Q->front = (Q->front+1)%MaxSize; //重新设置队头指针
}
// 清空队列
void CleaQueue(Queue *Q){
Q->front = Q->rear = 0;
}
// 打印队列元素
void PrintQueue(Queue *Q){
if(IsEmpty(Q)){
printf("队列为空!\n");
}
else{
int i = Q->front;
if(Q->front < Q->rear){
for(i;i<Q->rear;i++){
printf("%-3d",Q->Queue[i]);
}
}
else{
for(i;i<Q->rear+MaxSize;i++){
printf("%-3d",Q->Queue[i]);
}
}
}
printf("\n");
}
int main(){
Queue Q;
DataType e;
int n;
printf("第一次使用必须初始化!\n");
do{
printf("\n-----主菜单-----\n");
printf(" 1 初始化循环队列:\n");
printf(" 2 进队一个元素:\n");
printf(" 3 出队一个元素:\n");
printf(" 4 打印队列元素:\n");
printf(" 5 结束应用:\n");
printf("\n------------------\n");
scanf("%d",&n);
switch(n){
case 1:
InitQueue(&Q);
break;
case 2:
printf("请输入要插入的元素:e = ");
scanf("%d",&e);
EnQueue(&Q,e);
PrintQueue(&Q);
break;
case 3:
DeQueue(&Q,&e);
printf("出队的元素 :e = %d",e);
printf("");
break;
case 4:
PrintQueue(&Q);
break;
}
}while(n<=4);
return 0;
}
循环队列的基本操作——C语言
最新推荐文章于 2024-05-29 23:11:57 发布