循环队列基础操作(并不是全都有)

/*
1) 求队列中元素个数		QueueLength 
2) 判断是否空队列			QueueEmpty
3) 取队头元素				GetHead
4) 入队操作				EnQueue
5) 出队操作				DeQueue
6) 主函数(操作函数的调用)
*/
#include			//循环队列的存储结构
#include
#include 			//使用OVERFLOW时要用 
//#define OVERFLOW -2		//不想使用OVERFLOW宏定义的可以定义其为常量 
#define MAXQSIZE 100
typedef int ElemType;
typedef struct {
 	ElemType *base;
 	int front;
 	int rear;
}SqQueue;

void InitQueue(SqQueue *Q)
{//构造一个空队列Q
	 Q->base=(ElemType *)malloc(MAXQSIZE * sizeof(ElemType));
	 if(!Q->base) exit(OVERFLOW);
	 Q->front=Q->rear=0;
}

void QueueEmpty(SqQueue	*Q)
{//判断队列是否为空 
	if(Q->front==Q->rear)
	{
		printf("\n队列为空!");
	}
	else
	{
		printf("\n队列不为空!");
	}
}

int GetHead(SqQueue Q,ElemType *e)
{
	//若队不空,则用e返回S的栈顶元素 ,并返回1,否则返回0
	if(Q.front==Q.rear)
	{
	 	printf("\n队列为空!qingzhuyi");
	 	return 0;
	}
	*e=Q.base[Q.front];
	return 1;
}
void ClearQueue(SqQueue *Q)
{//置空
	 Q->front=Q->rear;
}

void EnQueue(SqQueue *Q,ElemType e)
{//入队
	 printf("\n输入要入队的元素:");
	 scanf("%d",&e);
 	if((Q->rear+1)%MAXQSIZE==Q->front)
	{
		printf("\n队满!");
		exit(0);
	}
 	Q->base[Q->rear]=e;
 	Q->rear=(Q->rear+1)%MAXQSIZE;
	printf("\n入队成功");
} 

void DeQueue(SqQueue *Q,ElemType e)
{//出队
 	if(Q->front==Q->rear)
	{
		printf("\n队空!即将退出程序!!");
	 	exit(0);
	}
 	e=Q->base[Q->front];
 	Q->front=(Q->front+1)%MAXQSIZE;
 	printf("\n出队成功!");
}

void QueueLength(SqQueue *Q)
{//求队列长度
 printf("\n队长为:%d",(Q->rear-Q->front+MAXQSIZE)%MAXQSIZE);
}

void PrintQueue(SqQueue *Q)
{//打印队列
 	int i=1;
 	if(Q->front==Q->rear)
	{
		printf("Sorry The Queue is Empty/n");
	}
 	while(Q->front!=Q->rear)
 	{
  		printf("\n队中第 %dth 个是 :%d ",i++,Q->base[Q->front]);
  		Q->front++;
 	}
}

int main()
{
 	SqQueue Q;
 	ElemType e;
 	int i;
 	InitQueue(&Q);	
 	while(1)
 	{
 		printf("\n***********************************\n请选择功能:\n0:EXIT\n1:QueueEmpty\n2:GetHead\n3:clearQueue\n4:EnQueue\n5:DeQueue\n6:find Queue length\n7:print Queue\n");
 		printf("选择功能:"); 
 		scanf("%d",&i);
 		switch(i)
  		{
  			case 1:QueueEmpty(&Q);
  				break;
  			case 2:GetHead(Q,&e);
  				printf("\n队首元素为:%d",e);
  				break;
  			case 3:ClearQueue(&Q);
			  	break;
  			case 4:EnQueue(&Q,e);
			 	break;
  			case 5:DeQueue(&Q,e);
			  	break;
 			case 6:QueueLength(&Q);
			  	break;
 			case 7:PrintQueue(&Q);
			  	break;
  		}
 	}
 	return 0;
}
*/

/*
注意


*1.OVERFLOW为math.h中的一个宏定义,如果要使用OVERFLOW的话,必须要饮用math.h头文件
2.此基础操作中,PrintQueue操作在执行过后相当于清空了队列。 所以该如何编写才能够在实现PrintQueue的同时不删除原本队列之中的元素?以便在代码循环调用时更加具有意义。


*/


引用:在我学习循环队列时,参考了CSDN用户Michael-H的博客《循环队列基本操作》
链接:Michael-Hd的博客](https://blog.csdn.net/hanghang121/article/details/41510679)

说明: 此篇博客是根据我本人实验课老师要求,然后在Michael-H的博客基础上扩展的。 并不是严格意义上的原创,但也并不是单纯的转载。


IT界编程小白,欢迎指正!
如果代码有问题或有改进,请在评论区留言,我会及时改正
也可联系E-mail:[email protected]

你可能感兴趣的:(数据结构,#,学习基础)