前言:找了上课时数据结构的教程来看,但是用的语言是c++,所以具体实现在网上搜大神的博客来看,我看到的大神们的博客都写得特别好,不止讲了最基本的思想和算法实现,更多的是侧重于实例运用,一边看一边在心里隐隐歌颂大神的厉害,然后别人的厉害不是我的,所以到底看得各种受打击+头昏脑涨,写这个系列是希望自己能够总结学到东一块.西一下的知识,因为水平有限+经验不足,所以在此只说最基础的思想,附上我自己的算法实现(肯定还有更优解),如果要想看进阶版的,可以在园里搜“数据结构”,各种语言实现和进阶提升的文章有很…
我们都知道一个栈的特点是后进先出,如果我们要实现在O(1)的时间内找到一个栈里面的最小值,我们应该怎么解决?如果我们采用遍历获取的思路那必然所需要的时间是O(N)与我们所需要的要求明显不符合,这时候我们通常需要采用的是和前面我们介绍到的栈的压入弹出序列相类似,采用辅助栈的思想.我们不妨构建一个辅助栈,当我们在栈压入数据时,就和辅助栈里面的最小值比较,如果大就存入栈里面的最小值,如果小我们就存入这个数据.我们的辅助栈是每存入一个数据的时候就存入一个当前数据结构的最小值,为了避免我们遇到一个问题,就…
二.栈与队列 1.栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底(Bottom). (2)当表中没有元素时称为空栈. (3)栈为后进先出(Last In First Out)的线性表,简称为LIFO表. 栈的修改是按后进先出的原则进行. 每次删除(退栈)的总是当前栈中"最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除. 图1 [示例]元素是以a1,a2,…,a…
(js描述的)数据结构[哈希表1.1](8) 一.数组的缺点 1.数组进行插入操作时,效率比较低. 2.数组基于索引去查找的操作效率非常高,基于内容去查找效率很低. 3.数组进行删除操作,效率也不高. 二.哈希表 1.几乎所有的编程语言都有直接或间接的应用这种数据结构 2.哈希表是基于 数组 实现的,但相对于数组有很多优势. 1.它可以提供非常快速的 插入-删除-查找 操作 2.无论多少数据,插入和删除需要接近常量的时间.即O(1)的时间级 3.哈希表的速度比树还要快,基本可以瞬间找到想要的元素…
(js描述的)数据结构[字典](7) 一.字典的特点 1.字典的主要特点是一一对应关系. 2.使用字典,剋通过key取出对应的value值. 3.字典中的key是不允许重复的,而value值是可以重复,并且字典中的key是无序的. 字典和映射关系: 字典和数组: 字典和对象: 二.代码实现字典 function Dictionary() { this.dic = {} // 1. add方法 Dictionary.prototype.add = function(key, value) { th…
(js描述的)数据结构[集合结构](6) 一.集合结构特点 1.集合中的元素不能重复. 2.集合是无序的. 二.集合的代码实现 function Set() { this.items = {} //1. add方法 Set.prototype.add = function(value) { //判断集合中是否包含元素 if (this.has(value)) { return false } //把数据添加到集合中 this.items[value] = value return true }…
(js描述的)数据结构[双向链表](5) 一.单向链表的缺点 1.只能按顺序查找,即从上一个到下一个,不能反过来. 二.双向链表的优点 1.可以双向查找 三.双向链表的缺点 1.结构较单向链表复杂. 2.占用内存比单项链表多. 四.双向链表的结构 五.双向链表的代码实现 function DoublyLinkedList() { // 内部节点类 function Node(data) { this.data = data this.next = null this.prev = null }…
(js描述的)数据结构 [链表](4) 一.基本结构 二.想比于数组,链表的一些优点 1.内存空间不是必须连续的,可以充分利用计算机的内存,事项灵活的内存动态管理. 2.链表不必再创建时就确定大小,并且大小可无限的延申下去 3.链表再插入和删除数据时,比数组的效率高很多 三.相比于数组,链表的一些缺点 1.链表访问任何一个位置的元素时,都需要从头开始访问 2.无法通过下标直接访问元素,需要从头开始访问,直到找到对应的元素 四.链表的封装 // 封装链表类 function LinkedList(…
(js描述的)数据结构[队列结构](3) 一.队列结构的特点: 1.基于数组来实现,的一种受限的线性结构. 2.只允许在表头进行删除操作,在表尾进行插入操作. 3.先进先出(FIFO) 二.队列的一些应用: 1.按一定顺序打印文档,执行输出后的结果. 2.多线程的实际执行顺序,就如队列结构相似. 三.队列的封装: function Queue() { this.items = [] //向队尾添加一个元素 Queue.prototype.enqueue = function (element)…
(js描述的)数据结构[栈结构](2) 一.什么是栈结构 1.一种受限制的线性结构,这种结构可以基于数组来实现. 2.可以抽象成一个容器,上面的是栈顶,底下的是栈底.所以仅允许对栈顶进行操作, 二.栈结构的应用 1.函数式调用栈:基于栈的形式来进行函数的整体调用. 2.递归:栈溢出就是其中的一点. 三. 栈结构常见的操作 push(): 添加一个元素到栈顶. pop(): 移除栈顶的元素. peek(): 返回栈顶的元素,不对栈结构做任何的修改. isEmpty(): 判断栈是否为空,不空的话返…