数据结构day5——队列和树
目录
一、队列:先进先出的数据缓冲区
队列的核心概念
队列的典型应用场景
队列的基本操作
队列的两种 C 语言实现方式
1. 顺序队列(基于数组的实现)
2. 循环队列(解决假溢出问题)
二、树:一对多的层次结构
树的基本概念
树的存储方式
二叉树:最常用的树结构
二叉树的定义
二叉树的特点
特殊的二叉树
二叉树的重要特性
二叉树的 C 语言实现与遍历
三、总结
在数据结构的世界里,队列和树是两种截然不同却又同样重要的结构。队列以其 "先进先出" 的特性成为处理有序数据的利器,而树则凭借 "一对多" 的层次关系,成为解决复杂问题的强大工具。本文将带你深入了解这两种结构的原理、特性,并通过 C 语言实现它们的核心功能。
一、队列:先进先出的数据缓冲区
队列(Queue)是一种限定仅在一端进行插入操作,另一端进行删除操作的线性表,这种特性使其成为处理有序数据的理想选择。
队列的核心概念
- 队尾(Rear):允许插入元素的一端
- 队头(Front):允许删除元素的一端
- 核心特性:先进先出(First In First Out,简称 FIFO)—— 最早进入队列的元素将最早被取出
队列的典型应用场景
队列最核心的应用是作为缓冲区,协调处理速度不同的设备或模块:
- CPU(高速设备)与硬盘、键盘、鼠标(低速设备)之间的数据交互
- 网络数据传输中的数据包排队处理
- 打印任务队列管理
- 广度优先搜索(BFS)算法的实现基础
队列的基本操作
操作名称 | 功能描述 | 时间复杂度 |
---|---|---|
initQueue | 初始化队列 | O(1) |
enQueue | 向队尾插入元素(入队) | O(1) |
deQueue | 从队头删除元素(出队) | O(1) |
getFront | 获取队头元素(不删除) | O(1) |
isEmpty | 判断队列是否为空 | O(1) |
isFull | 判断队列是否已满 | O(1) |
size | 获取队列中元素个数 | O(1) |
队列的两种 C 语言实现方式
1. 顺序队列(基于数组的实现)
顺序队列使用数组作为底层存储,但存在 "假溢出" 问题(队尾已满但队头有空闲空间)。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>#define MAX_QUEUE_SIZE 100typedef struct {int data[MAX_QUEUE_SIZE];int front; // 队头指针(指向队头元素)int rear; // 队尾指针(指向队尾元素的下一个位置)
} SeqQueue;// 初始化队列
void initQueue(SeqQueue *queue) {queue->front = 0;queue->rear = 0;
}// 判断队列是否为空
bool isEmpty(SeqQueue *queue) {return queue->front == queue->rear;
}// 判断队列是否已满
bool isFull(SeqQueue *queue) {return queue->rear == MAX_QUEUE_SIZE;
}// 入队操作
bool enQueue(SeqQueue *queue, int value) {if (isFull(queue)) {printf("队列已满,无法入队!\n");return false;}queue-