用顺序存储方式实现的队列。
#define MaxSize 10
typedef struct
{
ElemType data[MaxSize];
int front, rear; // 队头、队尾指针
} SqQueue;
// 初始化队列
void InitQueue(SqQueue &Q)
{
Q.front = Q.rear = 0;
}
// 判断队列是否为空
bool QueueEmpty(SqQueue Q)
{
return Q.rear == Q.front;
}
// 判断队列是否已满
bool QueueFull(SqQueue Q)
{
return (Q.rear + 1) % MaxSize == Q.front;
}
// 获取队长
int Length(SqQueue Q)
{
return (Q.rear + MaxSize - Q.front) % MaxSize;
}
队尾指针指向队尾元素的下一个位置。
// 入队
bool EnQueue(SqQueue &Q, int x)
{
if (QueueFull(Q))
{
return false;
}
Q.data[Q.rear] = x;
Q.rear = (Q.rear + 1) % MaxSize;
return true;
}
// 出队
bool DeQueue(SqQueue &Q, int x)
{
if (QueueEmpty(Q))
{
return false;
}
x = Q.data[Q.front];
Q.front = (Q.front + 1) % MaxSize;
return true;
}
// 读取队头元素
bool GetHead(SqQueue &Q, int &x)
{
if (QueueEmpty(Q))
{
return false;
}
x = Q.data[Q.front];
return true;
}
加入辅助变量。
#define MaxSize 10
typedef struct
{
ElemType data[MaxSize];
int front, rear;
int size;
} SqQueue;
- 初始时:
Q.front = Q.rear = 0;
,Q.size = 0;
- 入队:
Q.size++;
- 出队:
Q.size--;
- 队满条件:
Q.size == MaxSize;
- 队空条件:
Q.size == 0;
#define MaxSize 10
typedef struct
{
ElemType data[MaxSize];
int front, rear;
int tag;
} SqQueue;
- 初始时:
Q.front = Q.rear = 0;
,Q.tag = 0;
- 入队:
Q.tag = 1;
,只有入队操作,才能导致队满。 - 出队:
Q.tag = 0;
,只有出队操作,才能导致队空。 - 队满条件:
Q.front == Q.rear && Q.tag == 1;
- 队空条件:
Q.front == Q.rear && Q.tag == 0;
入队:
Q.rear = (Q.rear + 1) % MaxSize;
Q.data[Q.rear] = x;
初始化:
Q.front = 0;
Q.rear = MaxSize - 1;
判空:
(Q.rear + 1) % MaxSize == Q.front;
判满(牺牲一个存储单元):
(Q.rear + 2) % MaxSize == Q.front;
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode;
typedef struct
{
LNode *front, *rear; // 队列的队头、队尾指针
} LinkQueue;
// 初始化队列
bool InitQueue(LinkQueue &Q)
{
LNode *s = (LNode *)malloc(sizeof(LNode));
if (s == NULL)
{
return false;
}
s->next = NULL;
Q.front = Q.rear = s;
return true;
}
// 判断队列是否为空
bool QueueEmpty(LinkQueue Q)
{
return Q.rear == Q.front;
}
// 入队
bool EnQueue(LinkQueue &Q, int x)
{
LNode *s = (LNode *)malloc(sizeof(LNode));
s->data = x;
s->next = NULL;
Q.rear->next = s;
Q.rear = s;
return true;
}
// 出队
bool DeQueue(LinkQueue &Q, int x)
{
if (QueueEmpty(Q))
{
return false;
}
LNode *q = Q.front->next;
x = q->data;
Q.front->next = q->next;
if (Q.rear == q) // 如果是最后一个结点出队
{
Q.rear = Q.front;
}
free(q);
return true;
}
// 读取队头元素
bool GetHead(LinkQueue &Q, int &x)
{
if (QueueEmpty(Q))
{
return false;
}
LNode *q = Q.front->next;
x = q->data;
return true;
}
// 初始化队列
bool InitQueue(LinkQueue &Q)
{
Q.front = Q.rear = NULL;
return true;
}
// 判断队列是否为空
bool QueueEmpty(LinkQueue Q)
{
return Q.front = NULL;
}
// 入队
bool EnQueue(LinkQueue &Q, int x)
{
LNode *s = (LNode *)malloc(sizeof(LNode));
s->data = x;
s->next = NULL;
if (Q.front == NULL)
{
Q.front = s;
Q.rear = s;
}
else
{
Q.rear->next = s;
Q.rear = s;
}
return true;
}
// 出队
bool DeQueue(LinkQueue &Q, int x)
{
if (QueueEmpty(Q))
{
return false;
}
LNode *q = Q.front;
x = q->data;
Q.front = q->next;
if (Q.rear == q) // 如果是最后一个结点出队
{
Q.front = NULL;
Q.rear = NULL;
}
free(q);
return true;
}
// 读取队头元素
bool GetHead(LinkQueue &Q, int &x)
{
if (QueueEmpty(Q))
{
return false;
}
LNode *q = Q.front;
x = q->data;
return true;
}