用C语言实现环形队列算法
时间: 2023-09-16 18:05:33 浏览: 137
基于C和C++实现的嵌入式设备算法库(含PID控制器-哈夫曼编码器-哈希表-环形队列算法实现).zip
### 回答1:
以下是一个基于C语言的环形队列算法实现:
```
#include <stdio.h>
#include <stdlib.h>
#define QUEUE_SIZE 5
typedef struct {
int *arr; // 队列数据存储数组
int front; // 队首指针
int rear; // 队尾指针
int size; // 队列元素个数
} CircularQueue;
// 初始化队列
void initQueue(CircularQueue *q) {
q->arr = (int*)malloc(QUEUE_SIZE * sizeof(int));
q->front = 0;
q->rear = 0;
q->size = 0;
}
// 判断队列是否为空
int isEmpty(CircularQueue *q) {
return q->size == 0;
}
// 判断队列是否已满
int isFull(CircularQueue *q) {
return q->size == QUEUE_SIZE;
}
// 入队
void enqueue(CircularQueue *q, int val) {
if (isFull(q)) {
printf("Queue is full. Enqueue failed.\n");
return;
}
q->arr[q->rear] = val;
q->rear = (q->rear + 1) % QUEUE_SIZE;
q->size++;
}
// 出队
int dequeue(CircularQueue *q) {
if (isEmpty(q)) {
printf("Queue is empty. Dequeue failed.\n");
return -1;
}
int val = q->arr[q->front];
q->front = (q->front + 1) % QUEUE_SIZE;
q->size--;
return val;
}
// 获取队列长度
int getSize(CircularQueue *q) {
return q->size;
}
// 打印队列元素
void printQueue(CircularQueue *q) {
if (isEmpty(q)) {
printf("Queue is empty. No element to print.\n");
return;
}
printf("Queue elements: ");
for (int i = q->front; i != q->rear; i = (i + 1) % QUEUE_SIZE) {
printf("%d ", q->arr[i]);
}
printf("\n");
}
int main() {
CircularQueue q;
initQueue(&q);
enqueue(&q, 1);
enqueue(&q, 2);
enqueue(&q, 3);
enqueue(&q, 4);
enqueue(&q, 5);
printQueue(&q);
dequeue(&q);
dequeue(&q);
printQueue(&q);
enqueue(&q, 6);
enqueue(&q, 7);
printQueue(&q);
return 0;
}
```
这个实现中,定义了一个`CircularQueue`结构体表示环形队列。在初始化队列时,动态分配一个数组来存储队列元素,并将队首、队尾指针和队列元素个数初始化为0。入队时,先判断队列是否已满,如果已满则提示失败;否则将新元素插入队尾,并将队尾指针向后移动一个位置(如果到达数组末尾则回到数组头),同时队列元素个数加1。出队时,先判断队列是否为空,如果为空则提示失败;否则取出队首元素,将队
### 回答2:
环形队列是一种基于数组实现的队列结构,它的特点是可以在队列的开头和末尾进行插入和删除操作,并且能够循环利用数组空间。
在C语言中,我们可以通过定义一个数组以及两个指针(指向队头和队尾)来实现环形队列算法。以下是一个简单的示例代码:
```c
#include <stdio.h>
#define MAX_SIZE 10
// 定义队列结构
typedef struct {
int data[MAX_SIZE];
int front;
int rear;
} CircularQueue;
// 初始化队列
void initQueue(CircularQueue *queue) {
queue->front = queue->rear = 0; // 将队头和队尾指针都初始化为0
}
// 入队操作
void enqueue(CircularQueue *queue, int item) {
// 如果队列已满
if ((queue->rear + 1) % MAX_SIZE == queue->front) {
printf("队列已满,无法插入元素!\n");
return;
}
// 将新元素插入队尾,并更新队尾指针
queue->data[queue->rear] = item;
queue->rear = (queue->rear + 1) % MAX_SIZE;
}
// 出队操作
int dequeue(CircularQueue *queue) {
// 如果队列为空
if (queue->front == queue->rear) {
printf("队列为空,无法进行出队操作!\n");
return -1;
}
// 获取队头元素,并更新队头指针
int item = queue->data[queue->front];
queue->front = (queue->front + 1) % MAX_SIZE;
return item;
}
int main() {
CircularQueue queue;
initQueue(&queue);
// 入队
enqueue(&queue, 1);
enqueue(&queue, 2);
enqueue(&queue, 3);
// 出队
int item1 = dequeue(&queue);
int item2 = dequeue(&queue);
printf("出队的元素为:%d, %d\n", item1, item2);
return 0;
}
```
以上是用C语言实现环形队列算法的一个简单示例。你可以根据自己的需求进行扩展和优化。
### 回答3:
环形队列是一种特殊的队列数据结构,它以循环的方式存储数据,实现了先进先出的特性。用C语言实现环形队列算法的关键是维护队列的头指针和尾指针,以及判断队列是否为空或满的条件。
首先,需要定义一个固定大小的数组作为队列的存储空间,并定义一个指向数组的指针。接下来,定义头指针和尾指针,初始时它们都指向数组的第一个元素。
以下展示一个简单的环形队列算法实现:
1. 定义队列的结构体:
```c
#define MAX_SIZE 10
typedef struct {
int data[MAX_SIZE];
int front; //头指针
int rear; //尾指针
} CircularQueue;
```
2. 初始化队列:
```c
void initQueue(CircularQueue* queue) {
queue->front = queue->rear = 0;
}
```
3. 判断队列是否为空:
```c
int isEmpty(CircularQueue* queue) {
return (queue->front == queue->rear);
}
```
4. 判断队列是否已满:
```c
int isFull(CircularQueue* queue) {
return ((queue->rear + 1) % MAX_SIZE == queue->front);
}
```
5. 入队操作:
```c
void enqueue(CircularQueue* queue, int value) {
if (isFull(queue)) {
printf("队列已满,无法入队!\n");
return;
}
queue->data[queue->rear] = value;
queue->rear = (queue->rear + 1) % MAX_SIZE; //尾指针后移一位
}
```
6. 出队操作:
```c
int dequeue(CircularQueue* queue) {
if (isEmpty(queue)) {
printf("队列为空,无法出队!\n");
return -1;
}
int value = queue->data[queue->front];
queue->front = (queue->front + 1) % MAX_SIZE; //头指针后移一位
return value;
}
```
以上就是用C语言实现环形队列算法的简单实现。当队列的尾指针到达数组末尾时,再有元素入队时会循环到数组的开头,从而实现循环存储的特性。
阅读全文