循环队列的基本操作
2019-08-19 本文已影响0人
mark_x
- 判断队列是否已满:
(Q->rear+1)%MAX == (Q->front)
- 判断是否为空:
Q->rear == Q->front
- 元素入队,尾指针后移
Q->rear = (Q->rear + 1) % MAX
- 元素出队,头指针后移
Q->front = (Q->front) + 1 % MAX
- 计算队列长度
(Q.rear - Q.front + MAX) % MAX
#include <stdio.h>
#define MAX 6
typedef struct
{
int data[MAX];
int front; // 头指针
int rear; // 尾指针
}SqQueue;
void InitQueue(SqQueue *Q)
{
Q->front = 0;
Q->rear = 0;
}
int QueueLength(SqQueue Q)
{
return (Q.rear - Q.front + MAX) % MAX;
}
void EnQueue(SqQueue *Q, int e)
{
// 判断队列是否已满
if ((Q->rear +1) % MAX == Q->front)
{
printf("队列已满!\n");
}
Q->data[Q->rear] = e; // 在队尾加入新元素
Q->rear = (Q->rear + 1) % MAX; // 若到最后则转到数组头部
}
void DeQueue(SqQueue *Q, int *e)
{
if (Q->front == Q->rear)
{
printf("队列为空!\n");
}
*e = Q->data[Q->front];
Q->front = (Q->front + 1) % MAX;
}
int main(void)
{
// 初始化循环队列
SqQueue queue;
InitQueue(&queue);
// 循环队列求队列长度
int q_length = QueueLength(queue);
printf("循环队列长度为:%d\n", q_length);
// 循环队列的入队操作
EnQueue(&queue, 3);
EnQueue(&queue, 520);
printf("循环队列长度为:%d\n", QueueLength(queue));
// 循环队列出队操作
int num;
DeQueue(&queue, &num);
printf("出队元素为:%d\n", num);
DeQueue(&queue, &num);
printf("出队元素为:%d\n", num);
return 0;
}