堆,栈,队列,没有链表。

本文深入讲解了堆、栈和队列三种基本数据结构的特点及应用。堆作为一种特殊的树形结构,具备完全二叉树特性,分为最大堆和最小堆。栈遵循后进先出(LIFO)原则,适用于临时存储和逆序操作。队列则遵循先进先出(FIFO)原则,适合处理顺序任务。文章还详细介绍了这三种数据结构的实现方法和常见操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

堆,栈,队列。

(1)堆:什么是堆?又该怎么理解呢?

①堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:

   ·堆中某个节点的值总是不大于或不小于其父节点的值;

   ·堆总是一棵完全二叉树。

将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。

②堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。

③堆是应用程序在运行的时候请求操作系统分配给自己内存,一般是申请/给予的过程。

④堆是指程序运行时申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。

 

(2)(堆)

性质:LIFO后进先出

头文件:

#include <stack>

定义:stack<int> s;

      Stack<string> s1;

操作:

入栈,如例:s.push(x);
出栈,如例:s.pop();注意,出栈操作只是删除栈顶元素,并不返回该元素。
访问栈顶,如例:s.top()
判断栈空,如例:s.empty(),当栈空时,返回true
访问栈中的元素个数,如例:s.size()

  • (stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。

 

 

 

(3)队列:

性质:FIFO 先进先出

头文件:#include<queue>

定义:queue<int> q1;
queue<double> q2;

优先队列定义:

priority_queue<int> q1;
priority_queue< pair<int, int> > q2; // 注意在两个尖括号之间一定要留空格。
priority_queue<int, vector<int>, greater<int> > q3; // 定义小的先出队

priority_queue< int,vector<int>,greater<int> >//注意空格!!

操作:入队,如例:q.push(x); x 接到队列的末端。
出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
访问队首元素,如例:q.front(),即最早被压入队列的元素。
访问队尾元素,如例:q.back(),即最后被压入队列的元素。
判断队列空,如例:q.empty(),当队列空时,返回true
访问队列中的元素个数,如例:q.size()

特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。

建立顺序队列结构必须为其静态分配或动态申请一片连续的存储空间,并设置两个指针进行管理。一个是队头指针front,它指向队头元素;另一个是队尾指针rear,它指向下一个入队元素的存储位置。

 

(4):区别和联系:

1堆栈数据结构区别

堆(数据结构):堆可以被看成是一棵树,如:堆排序。

栈(数据结构):一种先进后出的数据结构。

 

 

2堆、栈、队列之间的区别是?

堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。

栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来。(后进先出)

列只能在队头做删除操作,在队尾做插入操作.而栈只能在栈顶做插入和删除操作。(先进先出)

### 队列数据结构的区别及应用场景 #### 区别 **1. 数据结构特性** - **(Heap)** 是一种特殊的树形数据结构,通常是一个完全二叉树,并且满足属性:父节点的值总是大于或等于(最大)或小于或等于(最小)其子节点的值。的主要特点是能够快速获取最大值或最小值[^2]。 - **(Stack)** 是一种线性数据结构,只允许在一端进行插入和删除操作,这一端被称为顶。遵循后进先出(LIFO, Last In First Out)的原则[^1]。 - **队列(Queue)** 也是一种线性数据结构,但它的插入操作只能在队尾进行,而删除操作只能在队头进行。队列遵循先进先出(FIFO, First In First Out)的原则[^5]。 **2. 内存管理与实现** - 在操作系统中,**** 是一块内存区域,用于存储函数调用时的局部变量、参数等信息。的管理由编译器自动完成,大小固定,超出容量会导致溢出(stack overflow)错误[^3]。 - **** 是程序运行时动态分配的内存空间,通常由程序员手动申请和释放。如果程序员没有显式释放内存,操作系统会在程序结束时回收这部分内存[^4]。 - **队列** 一般通过数组或链表来实现,既可以是静态的顺序存储结构,也可以是动态的链式存储结构。队列的大小可以根据需求变化,适用于需要处理大量数据的情况[^2]。 **3. 生长方向** - 的生长方向是从高地址向低地址扩展,而的生长方向正好相反,是从低地址向高地址扩展。这种设计是为了避免两者在内存中相互干扰。 --- #### 应用场景 **1. 的应用** - **优先队列**:最常见的应用之一是实现优先队列,其中每个元素都有一个优先级,优先级高的元素优先被处理。例如,在任务调度系统中,紧急的任务可以优先执行[^2]。 - **排序**:排序是一种基于结构的排序算法,能够在 O(n log n) 的时间复杂度内完成排序任务。它特别适合于大规模数据集的排序[^2]。 - **图算法中的最短路径问题**:Dijkstra 算法和 Prim 最小生成树算法都使用了来优化性能,尤其是当图的边数较多时,可以帮助提高效率[^2]。 ```python # 示例:Python 中使用 heapq 实现最小 import heapq heap = [] heapq.heappush(heap, 3) heapq.heappush(heap, 1) heapq.heappush(heap, 2) print(heapq.heappop(heap)) # 输出 1 ``` **2. 的应用** - **函数调用与递归**:在程序运行时用于保存函数调用的上下文信息,包括局部变量、返回地址等。每次函数调用都会将当前状态压入中,函数返回时再从中弹出。 - **括号匹配检查**:在编程语言解析过程中,常用于检查括号是否正确匹配。例如,每当遇到左括号时将其压入,遇到右括号时检查顶是否有对应的左括号并弹出[^1]。 - **表达式求值与转换**:可以用于将中缀表达式转换为后缀表达式(逆波兰表示法),并且可以用来计算后缀表达式的值。这种方法在计算器程序中非常常见。 ```python # 示例:使用实现括号匹配检查 def is_parentheses_matched(expression): stack = [] for char in expression: if char == '(': stack.append(char) elif char == ')': if not stack: return False stack.pop() return len(stack) == 0 print(is_parentheses_matched("((a + b) * c)")) # 输出 True ``` **3. 队列的应用** - **任务调度**:操作系统中的进程调度通常使用队列来管理等待执行的进程。先进先出的特性确保了公平性,所有进程都能按顺序获得 CPU 时间[^5]。 - **缓冲区管理**:在网络通信或文件读写中,队列可以用作缓冲区,临时存储尚未处理的数据包或字节流。这样可以平滑数据传输速率,防止数据丢失[^5]。 - **广度优先搜索(BFS)**:在图遍历算法中,队列用于实现广度优先搜索。BFS 从起始节点出发,逐层访问相邻节点,直到找到目标节点为止。这在社交网络分析、网页爬虫等领域有广泛应用[^5]。 ```python # 示例:使用队列实现广度优先搜索 from collections import deque def bfs(graph, start): visited = set() queue = deque([start]) while queue: node = queue.popleft() if node not in visited: print(node) visited.add(node) for neighbor in graph[node]: if neighbor not in visited: queue.append(neighbor) graph = { 'A': ['B', 'C'], 'B': ['A', 'D', 'E'], 'C': ['A', 'F'], 'D': ['B'], 'E': ['B', 'F'], 'F': ['C', 'E'] } bfs(graph, 'A') ``` --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值