循环队列基本操作

文章类型为学习笔记,都是基本操作......

直接上代码......

#include<stdio.h>
#include<malloc.h>
/*队列的最大长度*/
#define MAX_QUEUE_SIZE 6
/*循环队列类型*/
typedef struct {
	int *base;//循环队列存储空间
	int front;//队头
	int rear;//队尾
}Queue;
/*初始化队列,创建容量为MAX_QUEUE_SIZE的空队列*/
void InitQueue(Queue *Q){
	printf("初始化循环队列......\n");
	/*采用动态内存分配	malloc函数*/
	/*分配MAX_QUEUE_SIZE个int类型的存储单元*/
	/*并将这MAZ_QUEUE_SIZE个连续的int类型的存储单元的首地址存储到指针变量base中*/
	/*malloc函数返回值为void*	需要使用(int*)强制转换		*/
	Q->base=(int*)malloc(MAX_QUEUE_SIZE*sizeof(int));
	if(!Q->base){
		printf("循环队列创建失败!\n");
	}else{
		printf("循环队列创建成功!\n");
		/*初始化队头、队尾指针*/
		Q->front=Q->rear=0;
		printf("队头队尾指针初始化完毕!\n");
	}
	/*创建队列失败返回-1*/
	//if(!Q->base) return -1;
	/*初始化队头、队尾指针*/
	//Q->front=Q->rear=0;
	/*创建成功返回0*/
	//return 0;
}
/*打印队列中所有元素*/
void PrintQueue(Queue *Q){
	/*如果队列为空*/
	if(Q->rear==Q->front){
		printf("The Queue is empty!\n");
	}else{
		printf("The Queue is : ");
		for(int i=Q->front;i<Q->rear;i++){
			if(i==Q->rear-1){
				printf("%d\n",Q->base[i]);
			}else{
				printf("%d ",Q->base[i]);
			}
		}
	}
}
/*元素出循环队列*/
/*若队列不为空,则删除队头元素,由参数a带回其值并返回0,否则返回-1	*/
void DelQueue(Queue *Q,int *a){
	if(Q->rear==Q->front){
		printf("队列中没有任何元素!!!\n");
	}else{
		*a=Q->base[Q->front];
		Q->front=(Q->front+1)%MAX_QUEUE_SIZE;
		printf("元素%d出队列完成!!!\n",*a);
	}
	/*
	if(Q->rear==Q->front) return -1;
	*a =Q->base[Q->front];
	Q->front=(Q->front+1)%MAX_QUEUE_SIZE;
	return 0;
	*/
}
/*元素入循环队列*/
/*元素a入循环队列,成功返回0,否则返回-1*/
void EnQueue(Queue *Q,int a){
	/*(5+1)%6==0*/
	if((Q->rear+1)%MAX_QUEUE_SIZE==Q->front){
		printf("循环队列已满!请等待其它元素出队后在进行入队列!!!\n");
		/***
		/*调用元素出队列方法*/
		/*将队列中第一个元素拿出队列*/

		//删除队首元素报错....

		//DelQueue(Q,Q->base[Q->front]);
		//printf("队列出现空位,即将进行入队操作......");
		/*元素a排到队尾*/
		//Q->base[Q->rear]=a;
		/*移动队尾指针指向下一位*/
		//Q->rear=(Q->rear+1)%MAX_QUEUE_SIZE;
		//printf("元素%d入队列完成!!!\n",a);
		/*打印此时的队列中所有元素*/
		//PrintQueue(Q);
	}else{
		/*队列未满,进行入队列操作*/
		printf("当前循环队列未满!正在进行入队列操作......\n");
		/*元素a排到队尾*/
		Q->base[Q->rear]=a;
		/*移动队尾指针指向下一位*/
		Q->rear=(Q->rear+1)%MAX_QUEUE_SIZE;
		printf("元素%d入队列完成!!!\n",a);
		/*打印此时的队列中所有元素*/
		PrintQueue(Q);
	}
	/*(0+1)%6=1,此时队列空;(5+1)%6=0,此时队列满*/
	//if((Q->rear+1)%MAX_QUEUE_SIZE==Q->front) return -1;
	/*元素a进入队列,在队尾位置排队*/
	//Q->base[Q->rear]=a;
	//Q->rear=(Q->rear+1)%MAX_QUEUE_SIZE;
	//return 0;
}
/*测试方法1*/
void test1(){
	printf("测试方法一:\n");
	/*声明队列*/
	Queue queue;
	/*初始化队列*/
	InitQueue(&queue);
	/*打印初始队列*/
	PrintQueue(&queue);
	printf("元素入循环队列开始......\n");
	/*元素 10 入循环队列*/
	EnQueue(&queue,10);
	/*元素 32 入循环队列*/
	EnQueue(&queue,32);
	/*元素 52 入循环队列*/
	EnQueue(&queue,52);
	/*打印此时的循环队列*/
	//PrintQueue(&queue);
	for(int i=queue.front;i<queue.rear;i++){
		DelQueue(&queue,&queue.base[i]);
	}
	printf("循环队列测试一完成!!!\n");
}
/*测试方法2*/
void test2(){
	printf("测试方法二:\n");
	/*声明队列*/
	Queue queue;
	/*初始化队列*/
	InitQueue(&queue);
	/*打印初始队列*/
	PrintQueue(&queue);
	printf("元素入循环队列开始......\n");
	/*元素 10 入循环队列*/
	EnQueue(&queue,10);
	/*元素 32 入循环队列*/
	EnQueue(&queue,32);
	/*元素 52 入循环队列*/
	EnQueue(&queue,52);
	/*元素 64 入循环队列*/
	EnQueue(&queue,64);
	/*元素 21 入循环队列*/
	EnQueue(&queue,21);
	/*元素 11 入循环队列*/
	EnQueue(&queue,11);
	/*元素 33 入循环队列*/
	EnQueue(&queue,33);
	/*所有元素出队列*/
	/*
	for(int i=queue.front;i<queue.rear;i++){
		DelQueue(&queue,&queue.base[i]);
	}
	*/
	printf("循环队列测试二完成!!!\n");
}
/*测试*/
int main(){
	//test1();
	test2();
	return 0;
}

运行结果如下:

加载中...

加载中...

部分代码参考了《软件设计师教程》第5版

请各位大佬多多指教!!!


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值