#include <stdio.h>
#include <stdlib.h>
#define MAX_QSIZE 5
#define OVERFLOW 0
#define TRUE 1
#define FALSE 0
#define ERROR -1
#define OK 0
typedef int QElemType;
typedef int Status;
struct SqQueue
{
QElemType *base;
int front;
int rear;
};
void InitQueue(SqQueue &Q)
{
Q.base = (QElemType *)malloc(sizeof(QElemType));
if(!Q.base)
exit(OVERFLOW);
Q.front = Q.rear = 0;
}
void DestroyQueue(SqQueue &Q)
{
if(Q.base)
free(Q.base);
Q.base = NULL;
Q.front = Q.rear = 0;
}
void ClearQueue(SqQueue &Q)
{
Q.front = Q.rear = 0;
}
Status QueueEmpty(SqQueue Q)
{
if (Q.front == Q.rear)
{
return TRUE;
}
else
{
return FALSE;
}
}
Status QueueFull(SqQueue Q)
{
if ((Q.rear + 1) % MAX_QSIZE == Q.front)
{
return TRUE;
}
else
{
return FALSE;
}
}
Status GetHead(SqQueue Q, QElemType &e)
{
if (QueueEmpty(Q))
{
return ERROR;
}
e = Q.base[Q.front];
return OK;
}
Status EnQueue(SqQueue &Q, QElemType e)
{
if(QueueFull(Q))
return ERROR;
Q.base[Q.rear] = e;
Q.rear = (Q.rear + 1) % MAX_QSIZE;
return OK;
}
int QueueLength(SqQueue Q)
{
return (Q.rear - Q.front + MAX_QSIZE) % MAX_QSIZE;
}
Status DeQueue(SqQueue &Q, QElemType &e)
{
if(QueueEmpty(Q))
return ERROR;
e = Q.base[Q.front];
Q.front = (Q.front + 1) % MAX_QSIZE;
return OK;
}
void print(QElemType e)
{
printf("%d ", e);
}
void QueueTraverse(SqQueue Q, void(*visit)(QElemType))
{
int i = Q.front;
while(i != Q.rear)
{
visit(Q.base[i]);
i = (i + 1) % MAX_QSIZE;
}
printf("\n");
}
int main()
{
Status j;
QElemType d;
SqQueue Q;
InitQueue(Q);
EnQueue(Q, 1);
if(QueueFull(Q))
printf("Full\n");
else
printf("not Full\n");
EnQueue(Q, 2);
EnQueue(Q, 3);
EnQueue(Q, 4);
EnQueue(Q, 5);//ERROR
QueueTraverse(Q, print);
if(QueueFull(Q))
printf("Full\n");
else
printf("not Full\n");
DeQueue(Q, d);
printf("%d\n", d);
QueueTraverse(Q, print);
GetHead(Q, d);
printf("%d\n", d);
QueueTraverse(Q, print);
int len = QueueLength(Q);
printf("Length = %d\n", len);
return 0;
}
C语言循环队列
最新推荐文章于 2022-04-02 14:36:36 发布