选择合适的存储结构 (循环队列) 表示队列,解决队空、队满判断条件相同的矛盾,实现基于循环队列的存储结构的基本操作,初始化、队空/满判断,入队、出队、取队头元素等并加以验证。c语言
时间: 2024-11-16 21:20:08 浏览: 13
数据结构实验之队列实现:基于顺序存储的循环队列及其操作实践
在C语言中,我们可以使用数组来创建一个循环队列数据结构,它解决了普通队列(固定大小的数组)在队满或队空时需要额外空间处理的问题。循环队列的特点在于数组的一端用于添加元素(rear),另一端用于删除元素(front)。当队尾达到数组末尾时,下一个添加的位置会变成数组的第一个位置;同样,当队头到达数组首部时,实际队尾就在数组的倒数第二个位置。
下面是一个简单的循环队列的实现:
```c
typedef struct {
int capacity; // 队列容量
int front; // 队头指针
int rear; // 队尾指针
int *queue; // 存储元素的数组
} Queue;
// 初始化循环队列
Queue* createQueue(int size) {
Queue* q = (Queue*)malloc(sizeof(Queue));
q->capacity = size;
q->front = q->rear = -1;
q->queue = (int*)malloc(q->capacity * sizeof(int));
return q;
}
// 判断队列是否为空
bool queueEmpty(Queue* q) {
return q->front == q->rear;
}
// 判断队列是否已满
bool queueFull(Queue* q) {
if (q->front == 0 && q->rear == q->capacity - 1) {
return true;
}
else {
return false;
}
}
// 入队操作
void enqueue(Queue* q, int item) {
if (queueFull(q)) {
printf("Queue is full.\n");
} else {
if (q->front == -1) {
q->front = 0;
}
q->rear = (q->rear + 1) % q->capacity;
q->queue[q->rear] = item;
}
}
// 出队操作
int dequeue(Queue* q) {
if (queueEmpty(q)) {
printf("Queue is empty.\n");
return -1;
} else {
int item = q->queue[q->front];
if (q->front == q->rear) {
free(q->queue);
free(q);
q = NULL;
} else {
q->front = (q->front + 1) % q->capacity;
}
return item;
}
}
// 取队头元素
int getFront(Queue* q) {
if (queueEmpty(q)) {
printf("Queue is empty.\n");
return -1;
} else {
return q->queue[q->front];
}
}
// 示例使用
int main() {
Queue* q = createQueue(5);
// ...其他操作...
return 0;
}
```
在上述代码中,我们实现了队列的基本操作,包括初始化、队空/满判断以及入队、出队和获取队头元素。在队满或队空的操作中,通过检查front和rear的关系来判断,如果它们相加等于数组容量,即表示队列已满或已空。
阅读全文