#include
#include
#define MAXSIZE 6
typedef int QElemType;
typedef struct {
QElemType *base;
int front;
int rear;
}SqQueue;
SqQueue *InitQueue(SqQueue* Q);//初始化
SqQueue *DestroyQueue(SqQueue* Q);//销毁
void ClearQueue(SqQueue *Q);//清空
int QueueEmpty(SqQueue *Q);//判空
int QueueLength(SqQueue *Q);//队列长度
QElemType GetHead(SqQueue *Q);//获取队头元素
int EnQueue(SqQueue *Q, QElemType e);//插入新元素到队尾
int DeQueue(SqQueue *Q, QElemType *e);//删除队头元素
void QueueTraverse(SqQueue *Q);//遍历
//初始化
SqQueue *InitQueue(SqQueue* Q){
Q = (SqQueue *)malloc(sizeof(SqQueue));
Q->base = (QElemType *)malloc(sizeof(QElemType)*MAXSIZE);
if(!Q->base){
printf("空间不足,初始化失败\n");
return NULL;
}
Q->front=Q->rear=0;
printf("初始化成功\n");
return Q;
}
//销毁
SqQueue *DestroyQueue(SqQueue* Q){
free(Q->base);
free(Q);
printf("销毁成功\n");
return NULL;
}
//清空
void ClearQueue(SqQueue *Q){
int i=Q->front;
while(i%MAXSIZE != Q->rear){
printf("%d被清空\n",Q->base[i%MAXSIZE]);
Q->base[i%MAXSIZE] = 0;
i++;
}
printf("清空成功\n");
}
//判空,1为空
int QueueEmpty(SqQueue *Q){
return(Q->rear == Q->front);
}
//返回队列长度
int QueueLength(SqQueue *Q){
return (Q->rear-Q->front+MAXSIZE)%MAXSIZE;
}
//获取队头元素
QElemType GetHead(SqQueue *Q){
if(Q->front != Q->rear){
printf("队头元素是%d\n", Q->base[Q->front]);
return Q->base[Q->front];
}else{
printf("空队列,无队头\n");
}
}
//插入新元素到队尾,返回是否入队成功的状态
int EnQueue(SqQueue *Q, QElemType e){
//判定是否还有一个空
if((Q->rear+1)%MAXSIZE == Q->front){
printf("队列已满,%d元素入队失败\n",e);
return 0;
}
Q->base[Q->rear] = e;
//插入后尾指针加一
Q->rear = (Q->rear+1)%MAXSIZE;
printf("%d入队成功\n", e);
return 1;
}
//删除队头元素
int DeQueue(SqQueue *Q, QElemType *e){
//判空
if(Q->front==Q->rear){
printf("空队列,删除失败\n");
return 0;
}
*e = Q->base[Q->front];
Q->front=(Q->front+1)%MAXSIZE;
printf("%d元素出队成功\n", *e);
return 1;
}
//遍历
void QueueTraverse(SqQueue *Q){
if(QueueEmpty(Q)){
printf("空队列\n");
return;
}
int i=Q->front;
//只要不等于尾指针就一直遍历
while(i%MAXSIZE != Q->rear){
printf("%d ",Q->base[i%MAXSIZE]);
i++;
}
printf("\n");
}
int main(void)
{
SqQueue *Q = NULL;
QElemType e = NULL;
//初始化测试
Q = InitQueue(Q);
//遍历测试
QueueTraverse(Q);
// //入队测试
// EnQueue(Q, 1);
// EnQueue(Q, 2);
// EnQueue(Q, 3);
// EnQueue(Q, 4);
// QueueTraverse(Q);
// //长度测试
// printf("队列长度为%d\n",QueueLength(Q));
// EnQueue(Q, 1);
// EnQueue(Q, 2);
// EnQueue(Q, 3);
// EnQueue(Q, 4);
// printf("队列长度为%d\n",QueueLength(Q));
// EnQueue(Q, 5);
// EnQueue(Q, 6);
// printf("队列长度为%d\n",QueueLength(Q));
// //出队测试
// DeQueue(Q, &e);
// printf("测试e是否改变:%d\n",e);
// QueueTraverse(Q);
// //获取队头元素测试
// e = GetHead(Q);
// EnQueue(Q, 999);
// e = GetHead(Q);
// //出入测试
// EnQueue(Q, 1);
// EnQueue(Q, 3);
// EnQueue(Q, 5);
// EnQueue(Q, 7);
// EnQueue(Q, 9);
// EnQueue(Q, 11);
// QueueTraverse(Q);
// DeQueue(Q, &e);
// DeQueue(Q, &e);
// DeQueue(Q, &e);
// QueueTraverse(Q);
// EnQueue(Q, 7);
// EnQueue(Q, 9);
// EnQueue(Q, 11);
// EnQueue(Q, 13);
// QueueTraverse(Q);
// //清空测试
// EnQueue(Q, 7);
// EnQueue(Q, 9);
// EnQueue(Q, 11);
// EnQueue(Q, 13);
// ClearQueue(Q);
// QueueTraverse(Q);
//销毁测试
EnQueue(Q, 7);
EnQueue(Q, 9);
EnQueue(Q, 11);
EnQueue(Q, 13);
Q = DestroyQueue(Q);
QueueTraverse(Q);
return 0;
}