117.info
人生若只如初见

c语言列队怎样实现先进先出

在C语言中,实现队列的先进先出(FIFO)可以通过结构体、数组和链表三种数据结构来实现。这里我将分别介绍这三种方法:

  1. 使用结构体实现队列:
#include 
#include 

typedef struct {
    int *data;
    int front;
    int rear;
    int size;
    int capacity;
} Queue;

Queue* createQueue(int capacity) {
    Queue* queue = (Queue*)malloc(sizeof(Queue));
    queue->capacity = capacity;
    queue->front = queue->size = 0;
    queue->rear = capacity - 1;
    queue->data = https://www.yisu.com/ask/(int*)malloc(queue->capacity * sizeof(int));
    return queue;
}

int isFull(Queue* queue) {
    return (queue->size == queue->capacity);
}

int isEmpty(Queue* queue) {
    return (queue->size == 0);
}

void enqueue(Queue* queue, int item) {
    if (isFull(queue))
        return;
    queue->rear = (queue->rear + 1) % queue->capacity;
    queue->data[queue->rear] = item;
    queue->size = queue->size + 1;
}

int dequeue(Queue* queue) {
    if (isEmpty(queue))
        return -1;
    int item = queue->data[queue->front];
    queue->front = (queue->front + 1) % queue->capacity;
    queue->size = queue->size - 1;
    return item;
}

int main() {
    Queue* queue = createQueue(5);
    enqueue(queue, 10);
    enqueue(queue, 20);
    enqueue(queue, 30);
    enqueue(queue, 40);
    enqueue(queue, 50);

    while (!isEmpty(queue)) {
        printf("%d ", dequeue(queue));
    }

    free(queue->data);
    free(queue);
    return 0;
}
  1. 使用数组实现队列:
#include 
#include 

typedef struct {
    int *array;
    int front;
    int rear;
    int size;
    int capacity;
} QueueArray;

QueueArray* createQueueArray(int capacity) {
    QueueArray* queue = (QueueArray*)malloc(sizeof(QueueArray));
    queue->capacity = capacity;
    queue->front = queue->size = 0;
    queue->rear = capacity - 1;
    queue->array = (int*)malloc(queue->capacity * sizeof(int));
    return queue;
}

int isFull(QueueArray* queue) {
    return (queue->size == queue->capacity);
}

int isEmpty(QueueArray* queue) {
    return (queue->size == 0);
}

void enqueue(QueueArray* queue, int item) {
    if (isFull(queue))
        return;
    queue->rear = (queue->rear + 1) % queue->capacity;
    queue->array[queue->rear] = item;
    queue->size = queue->size + 1;
}

int dequeue(QueueArray* queue) {
    if (isEmpty(queue))
        return -1;
    int item = queue->array[queue->front];
    queue->front = (queue->front + 1) % queue->capacity;
    queue->size = queue->size - 1;
    return item;
}

int main() {
    QueueArray* queue = createQueueArray(5);
    enqueue(queue, 10);
    enqueue(queue, 20);
    enqueue(queue, 30);
    enqueue(queue, 40);
    enqueue(queue, 50);

    while (!isEmpty(queue)) {
        printf("%d ", dequeue(queue));
    }

    free(queue->array);
    free(queue);
    return 0;
}
  1. 使用链表实现队列:
#include 
#include 

typedef struct Node {
    int data;
    struct Node* next;
} Node;

typedef struct Queue {
    Node* front;
    Node* rear;
    int size;
} QueueLinkedList;

QueueLinkedList* createQueue() {
    QueueLinkedList* queue = (QueueLinkedList*)malloc(sizeof(QueueLinkedList));
    queue->front = queue->rear = NULL;
    queue->size = 0;
    return queue;
}

void enqueue(QueueLinkedList* queue, int item) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = https://www.yisu.com/ask/item;>next = NULL;

    if (queue->rear == NULL) {
        queue->front = queue->rear = newNode;
        return;
    }

    queue->rear->next = newNode;
    queue->rear = newNode;
}

int dequeue(QueueLinkedList* queue) {
    if (queue->front == NULL)
        return -1;

    Node* temp = queue->front;
    int item = temp->data;
    queue->front = queue->front->next;

    if (queue->front == NULL)
        queue->rear = NULL;

    free(temp);
    queue->size = queue->size - 1;
    return item;
}

int main() {
    QueueLinkedList* queue = createQueue();
    enqueue(queue, 10);
    enqueue(queue, 20);
    enqueue(queue, 30);
    enqueue(queue, 40);
    enqueue(queue, 50);

    while (!isEmpty(queue)) {
        printf("%d ", dequeue(queue));
    }

    return 0;
}

以上三种方法都可以实现队列的先进先出(FIFO)。

未经允许不得转载 » 本文链接:https://www.117.info/ask/feae3AzsKCQFVBQ.html

推荐文章

  • 怎么用c语言指针访问数组元素

    可以通过以下两种方式使用C语言指针访问数组元素: 使用指针下标访问数组元素:
    int arr[5] = {1, 2, 3, 4, 5};
    int *ptr = arr; // 将指针指向数组的...

  • c语言遍历文件夹的方法是什么

    在C语言中,要遍历文件夹可以使用系统提供的目录操作函数。以下是一种常见的方法:1. 使用`opendir()`函数打开要遍历的目录,该函数返回一个指向目录的指针。2. ...

  • c语言指向数组的指针如何定义

    C语言中,可以通过以下方式定义指向数组的指针: 指向数组的指针:指向数组的第一个元素的指针。 int arr[5]; // 定义一个数组
    int *p; // 定义一个指向int...

  • c语言数组指针怎么引用

    在C语言中,数组名本身就是一个指向数组首元素的指针。可以通过数组名来引用数组。
    例如,定义一个整型数组并赋初值:
    int arr[5] = {1, 2, 3, 4, 5};...

  • c语言swtich有何学习资源

    C语言中的switch语句是一种多路选择结构,它允许根据一个表达式的值来选择执行不同的代码块。以下是一些学习资源,可以帮助你掌握C语言中的switch语句: 书籍: ...

  • c语言swtich能进行调试吗

    C语言中的switch语句本身不能进行调试。switch语句是C语言中的一个控制结构,用于根据变量的值执行不同的代码块。虽然它可以用于条件判断,但它并不包含任何调试...

  • c语言swtich如何提高代码质量

    在C语言中,使用switch语句可以提高代码的可读性和可维护性。以下是一些建议,可以帮助你提高使用switch语句的代码质量: 使用枚举类型:将switch语句中的常量值...

  • c语言swtich怎样处理复杂情况

    在C语言中,switch语句通常用于基于不同条件执行不同的代码块。然而,switch语句并不直接支持处理复杂情况,特别是当涉及到多个条件和嵌套逻辑时。在这种情况下,...