/*
1) 求队列中元素个数 QueueLength
2) 判断是否空队列 QueueEmpty
3) 取队头元素 GetHead
4) 入队操作 EnQueue
5) 出队操作 DeQueue
6) 主函数(操作函数的调用)
*/
#include<stdio.h> //循环队列的存储结构
#include<stdlib.h>
#include<math.h> //使用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的同时不删除原本队列之中的元素?以便在代码循环调用时更加具有意义。
*/
引用:在我学习循环队列时,参考了优快云用户Michael-H的博客《循环队列基本操作》
链接:Michael-Hd的博客](https://blog.youkuaiyun.com/hanghang121/article/details/41510679)
说明: 此篇博客是根据我本人实验课老师要求,然后在Michael-H的博客基础上扩展的。 并不是严格意义上的原创,但也并不是单纯的转载。
IT界编程小白,欢迎指正!
如果代码有问题或有改进,请在评论区留言,我会及时改正
也可联系E-mail:1573865554@qq.com