通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

如何用 C 实现队列的程序代码

如何用 C   实现队列的程序代码

队列是一种数据结构,它遵循先进先出(FIFO)的原则。在C语言中实现队列的程序代码要点包括使用数组或链表存储队列元素、实现基础操作如入队Enqueue、出队Dequeue、查看队首元素Peek、以及检查队列是否为空IsEmpy。在使用数组实现队列时,需要两个指针标示队列的头部和尾部,对队列的操作需要对这两个指针进行更新。在使用链表实现队列时,我们通常保持对头节点和尾节点的引用以便于进行入队和出队操作。

以下将展开介绍如何用C语言分别通过数组和链表来实现队列。

一、使用数组实现队列

数组实现的队列有一个不可避免的问题就是队列的容量是固定的。为了避开这个问题,有时会使用循环数组来实现一个可以循环使用的队列。

初始化队列

首先,定义一个队列结构体,其中包含一个数组、一个头部指标和尾部指标,还有队列的最大容量。

typedef struct {

int *array;

int front; // 队头指标

int rear; // 队尾指标

int capacity; // 队列容量

} Queue;

初始化队列的函数需要分配数组的存储空间,并设置头部和尾部指标的初始值。

Queue* createQueue(int capacity) {

Queue *queue = (Queue *)malloc(sizeof(Queue));

if (!queue)

return NULL;

queue->capacity = capacity;

queue->front = queue->rear = 0;

queue->array = (int *)malloc(queue->capacity * sizeof(int));

if (!queue->array)

return NULL;

return queue;

}

入队(Enqueue)

入队操作将一个元素添加到队列的尾部。如果队列未满,则将元素插入到尾部指标的位置,并更新尾部指标。

void enqueue(Queue *queue, int item) {

if (queue->rear == queue->capacity) {

printf("\nQueue is full");

return;

}

queue->array[queue->rear++] = item;

}

出队(Dequeue)

出队操作将队列头部的元素移除,并更新头部指标。

int dequeue(Queue *queue) {

if (queue->front == queue->rear) {

printf("\nQueue is empty");

return INT_MIN;

}

int item = queue->array[queue->front++];

return item;

}

查看队首元素(Peek)

查看队首元素但不移除它。

int peek(Queue *queue) {

if (queue->front == queue->rear) {

printf("\nQueue is empty");

return INT_MIN;

}

return queue->array[queue->front];

}

检查队列是否为空(IsEmpty)

如果队列为空返回1,否则返回0。

int isEmpty(Queue *queue) {

return queue->front == queue->rear;

}

二、使用链表实现队列

相比数组,链表实现的队列不需要关心容量限制,因为它可以动态地增长和缩减。

初始化队列

链表队列的定义将包括一个指向头节点的指针和尾节点的指针。

typedef struct Node {

int data;

struct Node *next;

} Node;

typedef struct {

Node *front;

Node *rear;

} LinkedListQueue;

创建队列的函数相应地初始化头节点和尾节点为NULL。

LinkedListQueue* createLinkedListQueue() {

LinkedListQueue *queue = (LinkedListQueue *)malloc(sizeof(LinkedListQueue));

if (!queue)

return NULL;

queue->front = queue->rear = NULL;

return queue;

}

入队(Enqueue)

入队操作在链表尾部添加一个新的节点,并更新尾节点的指针。

void enqueueLinkedList(LinkedListQueue *queue, int item) {

Node *newNode = (Node *)malloc(sizeof(Node));

if (!newNode) {

printf("\nMemory error");

return;

}

newNode->data = item;

newNode->next = NULL;

if (queue->rear == NULL) {

queue->front = queue->rear = newNode;

return;

}

queue->rear->next = newNode;

queue->rear = newNode;

}

出队(Dequeue)

出队操作移除链表头部的节点,并更新头节点的指针。

int dequeueLinkedList(LinkedListQueue *queue) {

if (queue->front == NULL) {

printf("\nQueue is empty");

return INT_MIN;

}

Node *temp = queue->front;

int item = temp->data;

queue->front = queue->front->next;

if (queue->front == NULL) {

queue->rear = NULL;

}

free(temp);

return item;

}

查看队首元素(Peek)

查看队首元素但不移除它。

int peekLinkedList(LinkedListQueue *queue) {

if (queue->front == NULL) {

printf("\nQueue is empty");

return INT_MIN;

}

return queue->front->data;

}

检查队列是否为空(IsEmpty)

如果队列为空返回1,否则返回0。

int isEmptyLinkedList(LinkedListQueue *queue) {

return queue->front == NULL;

}

注意:在使用队列的过程中,必须正确管理内存,包括释放不再需要的动态分配的内存,以及防止内存泄露。

三、示例代码和测试

下面是一个简单的示例代码,以及如何测试我们上面实现的队列功能。

#include <stdio.h>

#include <stdlib.h>

#include <limits.h>

// 队列实现部分代码...

// 测试数组队列

void testArrayQueue() {

Queue *queue = createQueue(5);

enqueue(queue, 10);

enqueue(queue, 20);

enqueue(queue, 30);

enqueue(queue, 40);

printf("Dequeued from array queue: %d\n", dequeue(queue));

printf("Front item is: %d\n", peek(queue));

if(isEmpty(queue)) {

printf("Queue is empty");

} else {

printf("Queue is not empty");

}

// Free queue...

}

// 测试链表队列

void testLinkedListQueue() {

LinkedListQueue *queue = createLinkedListQueue();

enqueueLinkedList(queue, 10);

enqueueLinkedList(queue, 20);

enqueueLinkedList(queue, 30);

enqueueLinkedList(queue, 40);

printf("Dequeued from linked list queue: %d\n", dequeueLinkedList(queue));

printf("Front item is: %d\n", peekLinkedList(queue));

if(isEmptyLinkedList(queue)) {

printf("Queue is empty");

} else {

printf("Queue is not empty");

}

// Free queue...

}

int mAIn() {

testArrayQueue();

printf("\n");

testLinkedListQueue();

return 0;

}

以上代码提供了一个框架,演示如何在C语言中通过数组和链表实现的队列如何工作。需要注意的是,程序中应当包含必要的错误检查和输入验证,以确保程序的鲁棒性。在实际的软件工程实践中,队列会根据具体的应用需求进行相应的扩展和优化。

相关问答FAQs:

如何使用 C 编程语言实现队列的程序代码?

问题1:什么是队列数据结构?
回答1:队列是一种常见的数据结构,它具有先进先出(FIFO)的特性。类似于现实生活中排队的例子,只有队列前面的元素才能被访问或移除。

问题2:如何在 C 中声明和定义队列?
回答2:在 C 中实现队列,可以使用数组或链表两种方式。使用数组的实现方式,需要定义两个指针,分别指向队列的前端(front)和后端(rear)。使用链表的实现方式,则需要定义指向头结点和尾节点的指针。

问题3:如何实现队列的基本操作?
回答3:队列的基本操作包括入队(enqueue)和出队(dequeue)。入队操作将元素添加到队列的末尾,出队操作将队列的第一个元素删除并返回。入队时,需要判断队列是否已满,出队时,需要判断队列是否为空。

使用 C 编程语言,可以根据具体需求选择合适的实现方式来编写队列的代码,实现队列的基本操作,从而实现队列数据结构的功能。

相关文章