簡單的模擬循環隊列

 

 

//循環隊列  
#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;
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章