用数组实现循环队列
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define ERROR 0
#define OK 1
#define MAX_QSIZE 5
typedef int elemType;
typedef struct queue
{
elemType * base;
int front;
int rear;
}Queue, * queuePtr;
void initQueue(queuePtr qPtr)
{
qPtr->base = (elemType *)malloc(sizeof(elemType) * MAX_QSIZE);
if(!qPtr)
{
exit(OVERFLOW);
}
qPtr->front = qPtr->rear = 0;
}
void deleteQueue(queuePtr qPtr)
{
if(qPtr->base)
{
free(qPtr->base);
}
qPtr->base = NULL;
qPtr->front = qPtr->rear = 0;
}
void clearQueue(queuePtr qPtr)
{
qPtr->front = qPtr->rear = 0;
}
bool queueEmpty(queuePtr qPtr)
{
if(qPtr->front == qPtr->rear)
{
return TRUE;
}
else
{
return FALSE;
}
}
bool getHead(queuePtr qPtr, elemType *val)
{
if(qPtr->front == qPtr->rear)
{
return ERROR;
}
else
{
*val = qPtr->base[qPtr->front];
return OK;
}
}
bool endInsertQueue(queuePtr qPtr, elemType val)
{
if((qPtr->rear+1) % MAX_QSIZE == qPtr->front)
{
return ERROR;
}
qPtr->base[qPtr->rear] = val;
qPtr->rear = (qPtr->rear + 1) % MAX_QSIZE;
return OK;
}
void queueTraverse(queuePtr qPtr, void(* visit)(elemType))
{
int i = qPtr->front;
while(i != qPtr->rear)
{
visit(qPtr->base[i]);
i = (i + 1) % MAX_QSIZE;
}
printf("\n");
}
int queueLength(queuePtr qPtr)
{
return (qPtr->rear + MAX_QSIZE - qPtr->front) % MAX_QSIZE;
}
bool delfrontQueue(queuePtr qPtr, elemType * val)
{
if(qPtr->front == qPtr->rear)
{
return ERROR;
}
*val = qPtr->base[qPtr->front];
qPtr->front = (qPtr->front + 1) % MAX_QSIZE;
return OK;
}
void visit(elemType e)
{
printf("%d, ", e);
}
int main(int argc, char const *argv[])
{
Queue q;
queuePtr qPtr = &q;
elemType e;
bool bl;
initQueue(qPtr);
printf("%d\n", queueEmpty(qPtr));
for(int i = 0; i<4; i++)
{
endInsertQueue(qPtr, i*2);
}
queueTraverse(qPtr, visit);
printf("queue's length is:%d\n", queueLength(qPtr));
bl = delfrontQueue(qPtr, &e);
printf("delete:%d, e=%d\n", bl, e);
printf("Success!!!\n");
return 0;
}