简单的模拟循环队列

 

 

//循环队列  
#include<stdio.h>
#include<stdlib.h>

#define OK 1
#define ERROR 0

typedef int Status;
typedef int Elemtype;
typedef struct{
	int* base;
	int front;
	int rear;
	int size;
}queue;
//front前面预留一个空间 用来判满  
Status creat(queue* Q,int mm){
	Q->base=(Elemtype*)malloc(sizeof(Elemtype)*mm);
	if(!Q->base){
		printf("\t\t\t内存申请失败\n");
		return ERROR;
	}
	Q->front=0;
	Q->rear=0;
	Q->size=mm;
	return OK;
}
//队列长度  
int length(queue Q){
	return (Q.rear-Q.front+Q.size)%Q.size;//防止出现负数  
} 
//队列判满 
bool full(queue Q){
	return (Q.rear+1)%Q.size==Q.front;
} 
//队列判空 
bool empty(queue Q){
	return Q.front==Q.rear;
}
//入队 
Status enqueue(queue* Q,Elemtype e){
	if(full(*Q)){
		printf("\t\t\t队列已满,入队失败 !\n");
		return ERROR; 
	}
	Q->base[Q->rear]=e;
	Q->rear=(Q->rear+1)%Q->size;
//	printf("元素入队成功!");
	return OK;
} 
//出队  
Status dequeue(queue* Q){
	if(empty(*Q)){
		printf("\t\t\t当前队列为空!\n");
		return ERROR; 
	}
	Q->front=(Q->front+1)%Q->size;
	return OK;
}
//返回队首元素  
Elemtype getfront(queue Q){
	if(empty(Q))
		printf("\t\t\t当前队列为空!\n"); 
	else return Q.base[Q.front];
}
//输出队列的元素 
void show(queue Q){
	if(empty(Q)){
		printf("\t\t\t当前队列为空!\n");
		return ; 
	}
	int ff=Q.front;
	while(ff!=Q.rear){
		printf("%d ",Q.base[ff]);
		ff=(ff+1)%Q.size;
	}
	printf("\n");
} 

Status destroy(queue* Q){
	Q->front=0;
	Q->rear=0;
	Q->size=0;
	free(Q->base);
	return OK;
}

void menu(){
	printf("\t\t----------------循环队列的操作程序----------------\n");
	printf("\t\toption:\n");
	printf("\t\t\t1、创建一个循环队列\n");
	printf("\t\t\t2、查询当前队列的长度\n");
	printf("\t\t\t3、判断当前队列是否为空\n");
	printf("\t\t\t4、判断当前队列是否已满\n");
	printf("\t\t\t5、输出当前队列的元素\n");
	printf("\t\t\t6、将指定元素入队\n");
	printf("\t\t\t7、查询队首元素的值\n");
	printf("\t\t\t8、将队首元素出队\n");
	printf("\t\t\t9、销毁当前队列\n");
	printf("\t\t\t0、退出当前程序\n"); 
	printf("\t\t请输入你的选择: ");
}

int main()
{
	queue Q;
	while(1){
		menu();
		int op;
		int n,m;
		int e;
		scanf("%d",&op);
		switch(op){
			case 0:{
				system("cls");
				printf("\t\t\t谢谢您的操作,再见!\n");
				exit(0);
				break;
			} 
			case 1:{
				printf("\t\t\t请输入你要搭建的队列的大小:");
				scanf("%d",&n);
				creat(&Q,n); 
				system("cls");
				printf("\t\t\t创建成功!\n");
				break;
			}
			case 2:{
				system("cls");
				printf("\t\t\t当前队列的长度为 %d \n",length(Q));
				break;
			}
			case 3:{
				system("cls");
				if(empty(Q))
					printf("\t\t\t当前队列为空!\n");
				else printf("\t\t\t当前队列不为空!\n");
				break;
			}
			case 4:{
				system("cls");
				if(full(Q))
					printf("\t\t\t当前队列已满!\n");
				else
					printf("\t\t\t当前队列没满!\n"); 
				break;
			}
			case 5:{
				system("cls");
				printf("\t\t\t当前队列的内容为:\n\t\t\t");
				show(Q);
				break;
			}
			case 6:{
				system("cls");
				printf("\t\t\t请输入你想要入队的元素:");
				scanf("%d",&n);
				enqueue(&Q,n);
				break;
			} 
			
			case 7:{
				system("cls");
				printf("\t\t\t当前队首的元素为:%d\n",getfront(Q));
				break;
			}
			case 8:{
				system("cls");
				dequeue(&Q); 
				break;
			} 
			case 9:{
				system("cls");
				destroy(&Q);
				break;
			}
			
			default:
				system("cls");
				printf("\t\t你的输入有误,请重新输入!!!\n"); 
				break;
		}
		printf("\n"); 
	}
	return 0;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值