循环队列
循环队列可以更简单防止伪溢出的发生,但队列大小是固定的。
#include <stdio.h>
#include <stdlib.h>
typedef int Status;
#define TRUE 1;
#define FALSE 0;
#define OK 1;
#define ERROR -1;
#define INFEASBIOLE -2;
#define OVERFLOW 0;
#define MAX_QSIZE 5;
//存储模型
typedef struct
{
QElemType *base;
int front ;
int rear;
}SqQueue;
//循环队列的基本操作(9个)
Status InitQueue(SqQueue *Q)
{
//构造一个空队列Q
Q->base=(QElemType)malloc(sizeof(QElemType)*MAX_QSIZE);
if(!Q->base)
return OVERFLOW;
Q->front=Q->rear=0;
return OK;
}
Status DestroyQueue(SqQueue *Q)
{
//销毁队列
if(Q->base)
free(Q->base);
Q->base=NULL;
Q->front=Q->rear=0;
return OK;
}
Status ClearQueue(SqQueue *Q)
{
//清空队列
Q->front=Q->rear=0;
}
Status QueueEmpty(SqQueue Q)
{
//判断队列是否为空
return (Q->rear==Q->front);
}
Status QueueLength(SqQueue Q)
{
//求队列的长度
return(Q->rear-Q->front+MAX_QSIZE)%MAX_QSIZE;
}
Status GetHead(SqQueue Q,QElemType *e)
{
//返回队头元素
if(Q->front==Q->rear)
return ERROR;
*e=Q.base[Q->front];
return OK;
}
Status EnQueue(SqQueue *Q,QElemType *e)
{
//加入新的队尾元素
if(Q->rear+1)%MAX_QSIZE==Q->front;
return OVERFLOW;
Q->base[Q->rear]=e;
Q->rear=(Q->rear+1)%MAX_QSIZE;
return OK;
}
Status DeQueue(SqQueue *Q,QElemType *e)
{
//删除队头元素
if(Q->front==Q->rear)
return ERROR;
*e=Q->base[Q->front];
Q->front=(Q->front+1)%MAX_QSIZE;
return OK;
}
Status QueueTraverse(SqQueue *Q,void(*vi)(QElemType))
{
//遍历操作
int i;
i=Q->front;
while(i!=Q->rear)
{
vi(Q.base[i]);
i=(i+1)%MAX_QSIZE;
}
printf("\n");
}
int main()
{
printf("Hello world!\n");
return 0;
}