代码
#include <stdio.h>
#include <stdlib.h>
#define MAX_QUEUE_SIZE 100
#define OK 1
#define ERROR -1
typedef int Status;
typedef int ElemType;
typedef struct queue{
ElemType *Queue_array; //初始化的动态分布存储空间
int front;
int rear;
}SqQueue;
//循环队列初始化
Status Init_CirQueue(SqQueue *Q){
Q->Queue_array = (ElemType *)malloc(MAX_QUEUE_SIZE *sizeof(ElemType));
if(!Q->Queue_array)
return ERROR;
Q->front = Q->rear;
return OK;
}
//入队
Status Insert_CirQueue(SqQueue *Q, ElemType e){
if((Q->rear + 1) % MAX_QUEUE_SIZE == Q->front)
return ERROR;
Q->Queue_array[Q->rear] = e;
Q->rear = (Q->rear + 1) % MAX_QUEUE_SIZE;
return OK;
}
//出队, 返回出去的值
Status Delete_CirQueue(SqQueue *Q, ElemType *x){
if(Q->rear == Q->front)
return ERROR; //队空
*x = Q->Queue_array[Q->front];
Q->front = (Q->front + 1)%MAX_QUEUE_SIZE;
return OK;
}
//求长度
int Length_CirQueue(SqQueue Q){
return (Q.rear - Q.front + MAX_QUEUE_SIZE) % MAX_QUEUE_SIZE;
}
//是否为空
Status QueueEmpty(SqQueue Q){
if(Q.rear == Q.front)
return -1;
return 0;
}
//输出队列的值
Status QueueTraverse(SqQueue Q){
if(Q.rear == Q.front)
return ERROR;
while(Q.front != Q.rear){
printf("%d\t", Q.Queue_array[Q.front]);
Q.front++;
if(Q.front == MAX_QUEUE_SIZE - 1)
Q.front = 0;
}
printf("\n");
return OK;
}
//清空队列
Status ClearCirQueue(SqQueue *Q){
Q->rear = Q->front = 0;
return OK;
}
//得到头元素
Status GetHead(SqQueue Q){
if(Q.rear == Q.front)
return ERROR;
return (Q.Queue_array[Q.rear - 1]);
}
//销毁队列
void DstoryQueue(SqQueue *Q){
free(Q->Queue_array);
}
//队列是否为满
Status QueueFull(SqQueue Q){
if((Q.rear + 1) % MAX_QUEUE_SIZE == Q.front)
return 0;
return -1;
}
int main()
{
SqQueue Q;
Init_CirQueue(&Q);
int e, n, i, x;
int m = 0;
printf("添加几个元素:");
scanf("%d", &n);
for(i = 0; i < n; i++){
printf("输入第%d个数字:", i+1);
scanf("%d", &e);
Insert_CirQueue(&Q, e);
}
printf("1.输出队列;\n2.队列长度;\n3.出队并返回队尾元素;\n4.得到队头元素;\n5.判断队列是否为空;\n6.清空队列\n 7.是否为满\n");
printf("输入-1时结束操作\n");
while(m != -1){
scanf("%d", &m);
switch(m){
case 1:
printf("输出队列:\n");
QueueTraverse(Q);
break;
case 2:
printf("队列长度:\t%d\n", Length_CirQueue(Q));
break;
case 3:
Delete_CirQueue(&Q, &x);
printf("队列队尾元素为:%d\n", x);
break;
case 4:
printf("得到队头元素:%d\n", GetHead(Q));
break;
case 5:
printf("判断队列是否为空。-1为空,0为非空 \t%d\n",QueueEmpty(Q));
break;
case 6:
printf("清空队列\n");
ClearCirQueue(&Q);
break;
case 7:
printf("0:队列满,-1:队列未满 \t%d\n", QueueFull(Q));
}
}
return 0;
}
结果: