#include<stdio.h>
#include<malloc.h>
#include<windows.h>
#define MaxSize 50
//构造环形队列的数据类型
typedef char ElemType;
struct queue
{
ElemType data[MaxSize];//顺序存储数据元素
int front,rear;//分别是队首队尾的指示器
};
typedef struct queue Queue;
/*
函数功能:InitQueue,初始化空队列
函数形参:Queue *&Q
函数返回值:无
*/
void InitQueue(Queue *&Q)
{
//初始化空队列,申请起始地址,并初始化两个指示器的位置
Q=(Queue *)malloc(sizeof(Queue));
Q->front=Q->rear=0;
}
/*
函数功能:QueueEmpty,1代表空队列,0代表非空队列
函数形参:Queue *Q
函数返回值:int
*/
int QueueEmpty(Queue *Q)
{
return (Q->front==Q->rear);
}
/*
函数功能:enQueue 入队
函数形参:Queue*Q,ElemType e入队元素值
函数返回值:若队满则返回0表示入队失败,否则返回1,入队成功
*/
int enQueue(Queue *Q,ElemType e)
{
//判断队是否满
if((Q->rear+1)%MaxSize==Q->front) return 0;//入队失败
//入队,队尾指示器加1,元素入队
Q->rear=(Q->rear+1)%MaxSize;
Q->data[Q->rear]=e;
return 1;//入队成功
}
/*
函数功能:deQueue,出队
函数形参:Queue *Q,ElemType &e临时存放被出队元素
函数返回值:若队空则返回0表示出队失败,否则返回1,出队成功
*/
int deQueue(Queue *Q,ElemType &e)
{
//判断队是否空
if(Q->front==Q->rear) return 0;
//出队
//e=Q->data[(Q->front+1)%MaxSize];
Q->front=(Q->front+1)%MaxSize;
e=Q->data[Q->front];
return 1;//出队成功
}
/*
函数功能:DestroyQueue 释放内存
函数形参:Queue *Q
函数返回值:无
*/
void DestroyQueue(Queue *&Q)
{
free(0);
Q=NULL;
}
/*
函数功能:DispQueue从队首到队尾打印所有元素
函数形参:Queue *Q
函数返回值:无
*/
void DispQueue(Queue *&Q)
{
int i;
for(i=Q->front;i<Q->rear;i++)
printf("%c ",Q->data[i+1]);
printf("\n");
}
void QueueLength(Queue *Q,int &a)
{
a=(Q->rear-Q->front+MaxSize)%MaxSize;
}
int main()
{
Queue *Q;ElemType e,a;int b;
printf("(1)环形队列初始化。。。\n");InitQueue(Q);
printf("(2)环形队列当前状态是:");
if(QueueEmpty(Q)==1) printf("空队\n");
else printf("非空队\n");
printf("(3)元素入队\n");
if(enQueue(Q,'A')==1) printf("入队成功\n");
else printf("入队失败\n");
if(enQueue(Q,'B')==1) printf("入队成功\n");
else printf("入队失败\n");
if(enQueue(Q,'C')==1) printf("入队成功\n");
else printf("入队失败\n");
printf("(4)环形队列当前状态是:");
if(QueueEmpty(Q)==1) printf("空队\n");
else printf("非空队\n");
printf("打印元素\n");DispQueue(Q);
printf("统计长度\n");QueueLength(Q,b);
printf("%d",b);
printf("(5)元素出队");
if(deQueue(Q,e)==1) printf("出队成功,出队元素为:%c\n",e);
else printf("出队失败");
printf("(6)销毁队列\n");DestroyQueue(Q);
system ("PAUSE");
return 0;
}