一、数组实现
注意:front和rear的初始位置
typedef int Position;
struct QNode {
ElementType *Data; // 存储元素的数组
Position Front, Rear; // 队列的头、尾指针
int MaxSize; // 队列最大容量
}
typedef struct QNode *Queue;
Queue CreateQueue(int MaxSize)
{
Queue Q = (Queue)malloc(sizeof(struct QNode));
Q->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType));
Q->Front = Q->Rear = 0;
Q->MaxSize = MaxSize;
return Q;
}
bool IsFull(Queue Q)
{
return ((Q->Rear+1)%Q->MaxSize == Q->Front);
}
bool AddQ(Queue PtrQ, ElementType item)
{
if ( (PtrQ->Rear+1) % MaxSize == PtrQ->Front ) {
printf("队列满");
return false;
}
else {
PtrQ->Rear = (PtrQ->Rear+1) % MaxSize;
PtrQ->Data[PtrQ->Rear] = item;
return true;
}
}
bool IsEmpty(Queue Q)
{
return (Q->Front == Q->Rear)
}
ElementType DeleteQ(Queue)
{
if ( PtrQ->Front == PtrQ->Rear) {
printf("队列空");
return ERROR;
}
else {
PtrQ->Front = (PtrQ->Front+1) % MaxSize;
return PtrQ->Data[PtrQ->Front];
}
}
二、链表实现
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode Position;
struct QNode {
Position Front, Rear; // 队列的头、尾指针
int MaxSize; // 队列最大容量
};
typedef struct QNode *Queue;
bool IsEmpty(Queue Q)
{
return (Q->Front == NULL);
}
ElementType DeleteQ(Queue PtrQ)
{
Position FrontCell;
ElementType FrontElem;
if ( PtrQ->Front == NULL ) {
printf("队列空");
return ERROR;
}
FrontCell = PtrQ->Front;
if ( PtrQ->Front == PtrQ->Rear ) // 若队列只有一个元素
PtrQ->Front = PtrQ->Rear = NULL; // 删除后队列置为空
else
PtrQ->Front = PtrQ->Front->Next;
FrontElem =FrontCell->Data;
free(FrontCell); // 释放被删除结点空间
return FrontElem;
}