循环队列的C语言实现 --- 数据结构之队列的顺序存储
程序员文章站
2022-05-21 11:49:11
...
注意
这里队列的判满方法,采用的是少用一个元素空间的方法,即(rear + 1) % MaxSize == front
时,队列满。
代码
#include<stdio.h>
#include<malloc.h>
#define MaxSize 100 // 队列的最大长度为 100-1=99
typedef struct {
int data[MaxSize];
int front; // 头指针指向队首元素
int rear; // 尾指针指向队尾元素的下一个元素
} SeqQueue, *PSeqQueue;
// 初始化队列
PSeqQueue Init_SeqQueue() {
PSeqQueue Q;
Q = (PSeqQueue)malloc(sizeof(SeqQueue));
if (!Q) {
return NULL;
}
// 将队头和队尾指针置为0
Q->front = 0;
Q->rear = 0;
return Q;
}
// 返回队列的实际长度 = (rear - front + maxSize) % maxSize
int Length_SeqQueue(PSeqQueue Q) {
return ((Q->rear - Q->front + MaxSize) % MaxSize);
}
// 判断队列是否为空,队首和队尾指针相等时为空
int Empty_SeqQueue(PSeqQueue Q) {
return Q->front == Q->rear;
}
// 入队操作,参数x为入队元素
void In_SeqQueue(PSeqQueue Q, int x) {
// 判断队列是否已满,这里通过少用一个元素空间来判断队列是否已满
if ((Q->rear + 1) % MaxSize == Q->front) {
printf("Queue is full!\n");
return;
}
Q->data[Q->rear] = x; // 对应元素入队
Q->rear = (Q->rear + 1) % MaxSize; // 队尾指针后移
}
// 出队操作,参数e用来存储出队的元素
void Out_SeqQueue(PSeqQueue Q, int *e) {
if (Empty_SeqQueue(Q)) { // 判断队列是否为空
printf("Queue NULL!\n");
return;
}
*e = Q->data[Q->front]; // 出队元素的赋值
Q->front = (Q->front + 1) % MaxSize; // 队首元素后移
}
// 获取队首元素,存放在参数e中
int Front_SeqQueue(PSeqQueue Q, int *e) {
if (Empty_SeqQueue(Q)) {
printf("Queue NULL!\n");
return 0;
}
*e = Q->data[Q->front];
return 1;
}
// 遍历打印队列中的元素
void Print_SeqQueue(PSeqQueue Q) {
int i;
if (Empty_SeqQueue(Q)) {
printf("Queue NULL!\n");
} else {
i = Q->front;
while (i != Q->rear) {
printf("%d ", Q->data[i]);
i = (i + 1) % MaxSize;
}
printf("\n");
}
}
int main() {
PSeqQueue Q;
int e, n, i;
printf("input the number of data :\n");
scanf("%d", &n);
Q = Init_SeqQueue();
for (i = 0; i < n; i++) {
scanf("%d", &e);
In_SeqQueue(Q, e);
}
printf("The Queue is :\n");
Print_SeqQueue(Q);
printf("The length of Queue is %d.\n", Length_SeqQueue(Q));
Out_SeqQueue(Q, &e);
printf("The out data is %d.\n", e);
Front_SeqQueue(Q, &e);
printf("The front data is %d.\n", e);
printf("Now , the queue is :\n");
Print_SeqQueue(Q);
printf("The length of the new Queue is %d.\n", Length_SeqQueue(Q));
return 0;
}
上一篇: 发现环-蓝桥杯
下一篇: 线性表的顺序存储结构(c语言实现)