用c语言编写完整代码,实现用和静态内存分配方式分别编程实现循环顺序队列的创建、入队、出队、判断队空和队满操作?
时间: 2024-10-07 18:05:16 浏览: 61
当然可以。在C语言中,我们可以使用动态内存分配(malloc)实现动态数组来创建循环顺序队列,以及使用固定大小数组(静态内存分配)实现。以下是这两种情况下的示例代码:
**动态内存分配(使用链表)实现循环顺序队列**
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
typedef struct Queue {
Node *front;
Node *rear;
int size;
} Queue;
// 创建队列
Queue* createQueue() {
Queue *queue = (Queue*)malloc(sizeof(Queue));
queue->front = queue->rear = NULL;
queue->size = 0;
return queue;
}
// 入队
void enqueue(Queue *queue, int value) {
Node *newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = queue->rear;
if (queue->rear != NULL) {
queue->rear->next = newNode;
} else {
queue->front = newNode;
}
queue->rear = newNode;
queue->size++;
if (queue->size == MAX_SIZE) { // 队满检查
printf("Queue is full.\n");
}
}
// 出队
int dequeue(Queue *queue) {
if (queue->front == NULL) { // 队空检查
printf("Queue is empty.\n");
return -1; // 或者抛出错误
}
int value = queue->front->data;
Node *temp = queue->front;
queue->front = temp->next;
free(temp);
queue->size--;
if (queue->size == 0) { // 空队列
free(queue->rear); // 清理并释放内存
queue->rear = queue->front = NULL;
}
return value;
}
// 判断队空
int isQueueEmpty(Queue *queue) {
return queue->front == NULL;
}
// 判断队满
int isQueueFull(Queue *queue) {
return queue->size == MAX_SIZE;
}
int main() {
Queue *queue = createQueue();
// 使用enqueue、dequeue等函数操作队列...
return 0;
}
```
**静态内存分配(数组实现)**
由于数组长度固定,我们无法在运行时改变大小,所以不适合循环队列。但是,如果队列容量已知并且不会超过特定值,你可以这样做:
```c
#define MAX_SIZE 10
typedef struct QueueArray {
int items[MAX_SIZE];
int front;
int rear;
} QueueArray;
QueueArray* createQueueStatic(int max_size) {
QueueArray *queue = (QueueArray*)malloc(sizeof(QueueArray));
queue->front = queue->rear = 0;
return queue;
}
// 入队
void enqueueStatic(QueueArray *queue, int value) {
if (queue->rear + 1 == MAX_SIZE) {
printf("Queue is full.\n");
return;
}
queue->items[queue->rear] = value;
queue->rear = (queue->rear + 1) % MAX_SIZE;
}
// 出队
int dequeueStatic(QueueArray *queue) {
if (queue->front == queue->rear) {
printf("Queue is empty.\n");
return -1;
}
int value = queue->items[queue->front];
queue->front = (queue->front + 1) % MAX_SIZE;
return value;
}
// ...其他函数类似
int main() {
QueueArray *queue = createQueueStatic(MAX_SIZE);
// 使用enqueueStatic、dequeueStatic等函数操作队列...
return 0;
}
```
请注意,上述数组实现适用于小规模数据,并且队列的容量需要提前确定。
阅读全文