队列最简单的表示方法是用数组. 为了实现正确判断队列空和队列满两种情况, 我们需要2个指针,
front(指向第一个元素的前一个元素), rear(指向最后一个元素).
在初始情况下, front和rear都等于-1, 每入队一个元素rear都加1, 当rear=maxSize-1时,
即队列已满. 每出队一个元素, front+1
完整代码实现如下:
#include <stdio.h>
#include <stdlib.h>
struct queue {
int* data;
int front;
int rear;
int maxSize;
};
typedef struct queue node;
typedef struct queue* link;
// 函数声明
link createQueue (int maxSize);
void printQueue (link q);
int isFull (link q);
int isEmpty (link q);
int add (link q, int x);
int del (link q);
int main () {
int i;
int maxSize = 20;
link qhead = createQueue(maxSize);
// 初始队列信息
printQueue(qhead);
// 入队测试
for (i=1; i<=10; i++) {
add(qhead, i * 2);
}
printQueue(qhead);
// 出队测试
del(qhead);
del(qhead);
del(qhead);
printQueue(qhead);
return 0;
}
// 创建空队列
link createQueue (int maxSize) {
link q;
q = (node*)malloc(sizeof(node));
q->data = (int*)malloc(sizeof(int) * maxSize);
q->front = -1;
q->rear = -1;
q->maxSize = maxSize;
return q;
}
// 打印
void printQueue (link q) {
int i;
printf("当前队列的信息如下:
");
printf("front = %d
", q->front);
printf("rear = %d
", q->rear);
printf("maxSize = %d
", q->maxSize);
// 打印队列中的数据
if (isEmpty(q)) {
printf("当前队列中没有数据
");
} else {
printf("队列中的数据如下:
");
// 打印队列, 要根据front和rear来遍历
for (i=q->front+1; i<=q->rear; i++) {
printf("%d %d
", i, q->data[i]);
}
}
printf("
");
}
// 判断队列是否已满
// 是返回1, 否返回0
int isFull (link q) {
if (q->rear == q->maxSize - 1) {
return 1;
} else {
return 0;
}
}
// 判断队列是否为空
// 是返回1, 否返回0
int isEmpty (link q) {
// 两种判断方法, 一种是front=-1为空, 也可以front=rear
// 原理一样
if (q->rear == q->front) {
return 1;
} else {
return 0;
}
}
// 入队
int add (link q, int x) {
if (isFull(q)) {
printf("队列已满, 不能入队
");
return 0;
}
q->rear += 1;
q->data[q->rear] = x;
return 1;
}
// 出队
// 错误返回0, 正确返回被出队元素的值
int del (link q) {
if (isEmpty(q)) {
printf("队列为空, 不能出队
");
return 0;
}
q->front += 1;
return q->data[q->front];
}