数组、链表、栈、队列和STL
数组
数组是一种最基本的数据结构,它是内存上的一块连续存储空间。正因如此数组的随机访问很方便。但数组也有其固有的限制,大小分配后不能改变。

STL中的数组
STL中的Array是静态数组模板,就是我们所说的数组。使用方法如下。
std::array<int, 3> a1 = { 1, 2, 3 };
std::array<std::string, 2>a3 = {"a","b"};
STL中的Vector是动态数组模板,根据需要动态的分配内存。Vector的采用加倍的扩容策略。Push_back()最坏情况,最好和平均情况是。数组和动态数组常用来组成更复杂的数据结构。
链表
链表是一种线性表(有n个元素组成的有限序列),链表是一种基础的数据结构,通常有一连串的节点组成。节点中存放数据和指向下一节点的指针。因为链表不是按线性的顺序存储结构,其查询某节点的时间是,插入操作。链表分为单链表,双链表和循环链表。
单链表

双链表

循环单链表

循环双链表

链表的性能比较
单链表和双链表的查询时间最好情况,最坏和平均情况。
单链表涉及到向前访问的操作Before(),InsertBefore(),Remove()最坏和平均情况,最好情况。其他查询更新操作。
双链表的所有操作都是。

STL中的链表
List是用普通双链表实现的,如果在实际应用中需要使用链表,那么首先应该选择List。或者将List作为其成员。
链表和数组的对比
|
数组 |
动态数组 |
链表 |
|
快速的随机访问 |
快速的随机访问 |
快速的插入和删除 |
|
大小受限 |
动态分配 |
容量不受限 |
|
插入删除费时 |
插入删除费时 |
随机访问慢 |
Forward_list是C++11添加的,实现为一种简单的单链表,没有size()成员,只有前向迭代器没有反向迭代器。
栈
栈是一种后进先出的数据结构,可以用数组也可用链表实现。链表的实现形式更接近于栈的抽象概念,因为链表的节点数与栈中元素数目相同,而在数组实现形式中,数组的容量常常超过其尺寸。栈的直接应用包括函数调用,网页浏览记录,编辑器中的重做。。。栈也是其它数据结构和算法的基本组件。

顺序栈(用数组实现的栈)

链式栈(用链表实现的栈)

栈的性能比较

STL中的栈
STL中的stack是一种容器适配器,就是用其他容器最为底层实现,将其他容器转化为栈。Stack封装了入栈,出栈,取栈顶元素,查看大小和是否为空操作。默认情况下,stack用deque做底层容器。也可以将其修改为vector,list。
std::stack<int> deque_stack;
std::stack<int, std::vector<int>> vec_stack;
std::stack<int, std::list<int>> list_stack;
队列
队列是一种先进先出的数据结构,可以用数组也可以用链表实现队列。队列可用访问共享资源,排队购物。还用来构成其他更复杂的数据结构。

基于数组的队列

基于链表的队列

队列的性能分析

双端队列

双端队列的性能分析

优先队列
许多情况下队列的先入先出机制不能满足要求,此时需通过优先规则来完善入队出队的机制。优先队列应用而生。实现方式有两种:1.基于有序链表的实现,插入操作,删除操作;2.基于无序链表的实现,插入操作,删除操作。
堆(堆放在这里说是因为最大堆可用来实现优先队列)
堆是一种数据结构,完全二叉树,但在实现方式上没有选择一般的二叉树数据结构(即一个结点包含两个指向孩子的指针)而使用了数组。要明白堆的含义,必须知道什么是完全二叉树,完全二叉树是有满二叉树引起的,了解满二叉树也是必要的。
一般的树中,某结点的高度和深度的定义。

满二叉树: 如果一个二叉树的任意结点或者有0或者有2个孩子。
完全二叉树:如果一个二叉树除倒数第一层外都被填满,并且倒数第一层从左至右填充。
完美树:如果一个二叉树的所有层被填满。

堆的定义:1.是一个完全二叉树;2.上层的节点键值大于下层节点键值(最小堆),或者相反(最大堆)。
基于数组实现的堆
某节点位于数组i处,做左子节点位于2i,右子节点位于2i+1,数组第一个位置未使用。

STL中的队列
1.queue
STL中的queue是一种容器适配器,默认的底层实现容器是deque。这一点和stack很像,通过关闭或者限制deque的一些借口可以很轻松的实现stack和queue。Deque是stack和queue的幕后功臣。那么deque是怎么实现的?
2.deque
Deque是双端队列,它的空间构造是几块分段线性的存储区。其实现细节非常复杂。

Deque是如何扩展空间的?
如果缓冲区中还有备用的空间,那么直接使用备用的空间;否则,另外配置一个缓冲区,将其信息记录到缓冲区地址表里;更有甚者,如果缓冲区地址表都不够的时候,缓冲区地址表也要严格依从"重新配置,复制,释放"规则,但相比对"重新配置,复制,释放"规则宗教式追狂热的vector而言,效率高很多。侯杰老师推荐,将deque所有的元素倒腾到一个vector中,再用STL<algorithm>的sort()函数,再从vector中倒腾进deque中。这种折腾是必须的,直接在的deque内部进行排序,效率更低。(引http://daoluan.net/blog/stl-deque/)
3.priority_queue
Priority_queue优先级队列是一个拥有权值概念的单向队列queue,在STL的具体实现中也是以别的容器为底层数据结构,在利用堆的规则调整元素之间的位置。默认的底层实现是vector。这与queue的默认底层实现deque差别很大。
4.heap
STL中关于堆的操作,建堆make_heap(),加数据push_heap(),删数据pop_heap(),堆排序sort_heap()。头文件<algorithm>。
总结
|
数组 |
静态数组=array |
|
动态数组=vector |
|
|
链表 |
单链表= forward_list |
|
双链表=list |
|
|
队列 |
单向队列=queue(默认deque) |
|
单向数组队列=queue<类型,vector<类型>> |
|
|
单向链式队列=queue<类型,list<类型>> |
|
|
双向队列=deque |
|
|
优先队列=priority_queue(默认vector) |
|
|
堆栈 |
meak_heap,push_heap,pop_heap,sort_heap |
练习
1.手写堆
2.利用STL实现优先队列
数组、链表、栈、队列和STL的更多相关文章
- python数据结构-数组/列表/栈/队列及实现
首先 我们要分清楚一些概念和他们之间的关系 数组(array) 表(list) 链表(linked list) 数组链表(array list) 队列(queue) 栈(stack) li ...
- JavaScript 数据结构与算法之美 - 线性表(数组、栈、队列、链表)
前言 基础知识就像是一座大楼的地基,它决定了我们的技术高度. 我们应该多掌握一些可移值的技术或者再过十几年应该都不会过时的技术,数据结构与算法就是其中之一. 栈.队列.链表.堆 是数据结构与算法中的基 ...
- 使用python实现数组、链表、队列、栈
引言 什么是数据结构? 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成. 简单来说,数据结构就是设计数据以何种方式组织并存储在计算机中. 比如:列表,集合和字 ...
- JavaScript高级程序设计--对象,数组(栈方法,队列方法,重排序方法,迭代方法)
1.使用对象字面量定义对象 var person={}; 使用这种方式创建对象时,实际上不会调用Object构造函数. 开发人员更喜欢对象字面量的语法. 2.有时候需要传递大量可选参数的情形时,一 ...
- Javascript用数组实现栈和队列
栈是遵循后进先出(LIFO)规则的一种有序集合,比如桌上的一叠书,我们只能从上面放或取. 队列是遵循先进先出(FIFO)规则的一种有序集合,比如排队,先排到的先离开. 数组也是一种有序的集合,它与上面 ...
- java——链表、链表栈 LinkedListStack、链表队列 LinkedListQueue
LikedList: package Date_pacage; public class LinkedList<E> { public static void main(String[] ...
- Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现
栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...
- 算法入门 - 基于动态数组的栈和队列(Java版本)
之前我们学习了动态数组的实现,接下来我们用它来实现两种数据结构--栈和队列.首先,我们先来看一下栈. 什么是栈? 栈是计算机的一种数据结构,它可以临时存储数据.那么它跟数组有何区别呢? 我们知道,在数 ...
- java 集合 Connection 栈 队列 及一些常用
集合家族图 ---|Collection: 单列集合 ---|List: 有存储顺序 , 可重复 ---|ArrayList: 数组实现 , 查找快 , 增删慢 ---|LinkedList: 链表实 ...
随机推荐
- 2013款MacBook Air装Windows7单系统
经过两天的摸索,查找无数资料终于把2013款的MacBook Air装上了WIN 7,虽然网上有很多的资料但是都不是我想要的,第一个我的是2013款的MacBook Air,跟原来2012 11款Ma ...
- POJ 3041 - 最大二分匹配
这道题实现起来还是比较简单的,但是理解起来可能有点困难. 我最开始想到的是贪心法,每次消灭当前小行星最多的一行或一列.然而WA了.Discuss区里已经有高人给出反例. 下面给出正确的解法 我们把行和 ...
- sql server 查询时间 格式化输出
use test select * from vote insert into vote (contents) values(GETDATE()) insert into vote (contents ...
- 团体程序设计天梯赛-练习集-L1-048. 矩阵A乘以B
L1-048. 矩阵A乘以B 给定两个矩阵A和B,要求你计算它们的乘积矩阵AB.需要注意的是,只有规模匹配的矩阵才可以相乘.即若A有Ra行.Ca列,B有Rb行.Cb列,则只有Ca与Rb相等时,两个矩阵 ...
- 解析MYsql写的表达式
今天遇到个问题,Sql中直接写的是复杂表达式,如何解析呢? round(((0.00579049505+0.00006600324*JING_JIE^2*SHU_GAO-0.00000046921*J ...
- 肯德基收银系统java
参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式(2种以上)至少实现系统的以下功能: 1.正常餐品结算和找零. 2.基本套餐结算和找零. 3.使用优惠 ...
- Docker 导入镜像报错:open /var/lib/docker/tmp/docker-import-743441288/redis-3.0.7/json: no such file or directory
下载好了redis的tar包,然后导入redis镜像是报错open /var/lib/docker/tmp/docker-import-743441288/redis-3.0.7/json: no s ...
- 【JavaScript游戏开发】使用HTML5+Canvas+JavaScript 封装的一个超级马里奥游戏(包含源码)
这个游戏基本上是建立在JavaScript模块化的开发基础上进行封装的,对游戏里面需要使用到的游戏场景进行了封装,分别实现了Game,Sprite,enemy,player, base,Animati ...
- Linux思维导图之文本工具、正则
习题巩固: 1,找出的ifconfig"网卡名"命令结果中本机的IPv4的地址 2,查出分区空间使用率的最大百分比值 3,查出用户UID最大值的用户名,UID及壳类型 4,查出的/ ...
- 29.es路由原理
主要知识点 1.document路由到shard的理解及原理 2.路由算法:shard = hash(routing) % number_of_primary_shards 3.routing值(_i ...
