数组

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

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的更多相关文章

  1. python数据结构-数组/列表/栈/队列及实现

    首先 我们要分清楚一些概念和他们之间的关系 数组(array)  表(list)  链表(linked list)  数组链表(array list)   队列(queue)  栈(stack) li ...

  2. JavaScript 数据结构与算法之美 - 线性表(数组、栈、队列、链表)

    前言 基础知识就像是一座大楼的地基,它决定了我们的技术高度. 我们应该多掌握一些可移值的技术或者再过十几年应该都不会过时的技术,数据结构与算法就是其中之一. 栈.队列.链表.堆 是数据结构与算法中的基 ...

  3. 使用python实现数组、链表、队列、栈

    引言 什么是数据结构? 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成. 简单来说,数据结构就是设计数据以何种方式组织并存储在计算机中. 比如:列表,集合和字 ...

  4. JavaScript高级程序设计--对象,数组(栈方法,队列方法,重排序方法,迭代方法)

    1.使用对象字面量定义对象 var person={}; 使用这种方式创建对象时,实际上不会调用Object构造函数. 开发人员更喜欢对象字面量的语法.   2.有时候需要传递大量可选参数的情形时,一 ...

  5. Javascript用数组实现栈和队列

    栈是遵循后进先出(LIFO)规则的一种有序集合,比如桌上的一叠书,我们只能从上面放或取. 队列是遵循先进先出(FIFO)规则的一种有序集合,比如排队,先排到的先离开. 数组也是一种有序的集合,它与上面 ...

  6. java——链表、链表栈 LinkedListStack、链表队列 LinkedListQueue

    LikedList: package Date_pacage; public class LinkedList<E> { public static void main(String[] ...

  7. Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现

    栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...

  8. 算法入门 - 基于动态数组的栈和队列(Java版本)

    之前我们学习了动态数组的实现,接下来我们用它来实现两种数据结构--栈和队列.首先,我们先来看一下栈. 什么是栈? 栈是计算机的一种数据结构,它可以临时存储数据.那么它跟数组有何区别呢? 我们知道,在数 ...

  9. java 集合 Connection 栈 队列 及一些常用

    集合家族图 ---|Collection: 单列集合 ---|List: 有存储顺序 , 可重复 ---|ArrayList: 数组实现 , 查找快 , 增删慢 ---|LinkedList: 链表实 ...

随机推荐

  1. XML、集合、JSP综合练习

    一.利用DOM解析XML文件得到信息:存入泛型集合中在JSP页面循环打印读取的信息 a)         编写XML文件:添加测试节点数据 b)         建立web项目:在JSP页面中使用DO ...

  2. layui 下拉框取值

    layui.use('form', function () { var form = layui.form; form.on('select(Status)', function (data) { c ...

  3. python 处理中文 读取数据库输出全是问号

    ref:http://www.cnblogs.com/zhoujie/archive/2013/06/07/problem1.html 1.python连接mssql数据库编码问题 python一直对 ...

  4. 连接mysql时遇到的问题

    1.报错:The server time zone value '???ú±ê×??±??' is unrecognized or represents 解决方法:在jdbc连接的url后面加上ser ...

  5. PAT_A1108#Finding Average

    Source: PAT A 1108 Finding Average (20 分) Description: The basic task is simple: given N real number ...

  6. PHP第一节课

    基础语法 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...

  7. swift-导航栏添加自定义返回按钮

    //1.添加返回按钮 func addBackBtn(){ let leftBtn:UIBarButtonItem=UIBarButtonItem(title: "返回", sty ...

  8. 关于linux suse11忘记root密码修改方法

    SUSE Linux忘记root密码   1.重新启动机器,在出现grub引导界面后,按F2,在启动linux的选项里加上init=/bin/bash,通过给内核传递init=/bin/bash参数使 ...

  9. 【1】Django概述

    道生一,一生二,二生三,三生万物 无名天地之始,有名万物之母 ——老子 python程序web项目开发,是非常重要的一部分,Python为基础的web项目开发的框架有很多,django无疑是最强大we ...

  10. [SDOI2008]沙拉公主的困惑 线性筛 素数+欧拉

    本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia [SDOI2008]沙拉公主的困惑 线性筛 素数+欧拉 题目大意 给定n,m,求在1到n!内与m!互质的 ...