数组、链表、栈、队列和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: 链表实 ...
随机推荐
- 06--c++友元类
=======================什么是友元类======================= 当一个类B成为了另外一个类A的“朋友”时,那么类A的私有和保护的数据成员就可以被类B访问.我们 ...
- 01 Centos安装python3
Centos安装python3 安装软件的方法有哪几种 1 yum一键安装 2 rpm包安装(太麻烦,不推荐使用) 3 下载源码包,进行编译安装 安装python3的步骤 1.下载python3源码包 ...
- Windows Server 2008 R2 搭建DNS服务器(转)
Windows Server 2008 R2 搭建DNS服务器将本机IP设为首选DNS服务器的地址在dos 下分别输入 nslookup www.mydns.com 和 nslookup 192.16 ...
- nyoj23-取石子(一)
取石子(一) 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 一天,TT在寝室闲着无聊,和同寝的人玩起了取石子游戏,而由于条件有限,他/她们是用旺仔小馒头当作石子.游戏的 ...
- 自动装箱拆箱(Autoboxing,Unboxing)
自动装箱和拆箱 https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html 1.5才有(Autoboxing,Unboxing) ...
- apache+php连接数据库
######## 安装APACHE ##############安装apr/usr/src/apache+php/tar xf apr-1.5.2.tar.gzcd apr-1.5.2./config ...
- Q&A to prepare interview of HSBC
1.How do you keep updating lastest IT knowledge? 1).keep an eye on current project technology evetho ...
- numpy中sum(axis=0)和axis=1的计算原理
看起来挺简单的样子,但是在给sum函数中加入参数.sum(a,axis=0)或者是.sum(axis=1) 就有点不解了 在我实验以后发现 我们平时用的sum应该是默认的axis=0 就是普通的相加 ...
- 解决ExpressSpreadSheet 中文乱码问题[备查]
cxSpreadSheet和F1Book等都提供了类似Excel的操作, 但是相比F1Book, cxSpreadSheet的中文支持还不是很完善.在设置了wordbreak为true的时候,里面的中 ...
- 【hihocoder 1499】A Box of Coins
[题目链接]:http://hihocoder.com/problemset/problem/1499 [题意] [题解] 贪心,模拟; 从左往右对于每一列; 如果上下两个格子; ① 有一个格子超过了 ...