1好久没更新数据结构,先来几个简单的热热身。
一、热身
1.栈
从栈顶压入元素,从栈顶弹出元素,数据只有一个出入口。元素的进出顺序会是后进先出。
压入举例:stack.push(10),此时栈为[10]; stack.push(3),此时栈为[10,3];stack.push(7),此时栈为[10,3,7]
如果按刚刚的压入来弹出的话:stack.pop,结果会是7,栈会变成[10,3]
如果栈空了,则会返回nil。
当调用函数时,CPU会将函数返回地址压入到运行栈中,当这个函数执行结束时,CPU将返回地址从栈中取出,如果不断调用函数时,会得到栈溢出(stack overflow)的错误,因为CPU运行栈没有空间了。
2.队列
本质是列表,只能从队尾添加元素,从队首移除元素,先进先出。
队列举例:入队: quene.enquenue(10) ,此时队列为[10]; quene.enquenue(3), 此时队列为[10,3];
出队:quene.dequenue(),返回10.先进先出,此时队列为[3],往前移动一位。
一般入队的效率是很高的,o(1),但是出队会是o(n),因此对dequenue做了改进,让出队的为空,设为nil来移除,再将head的值+1,使得下一个元素变成新的队首。
3.列表
(1)链表
链表是一系列数据项,有点像数组,但是数组是分配了一大块内存,而链表是的元素在内存中是完全独立的对象,通过链接连接。
链表的元素为节点,单链表中,每个节点只有一个向下一个节点的引用(指针),双链表中,节点还有指向前一个节点的指针。开始位置,会有一个head指针的指向,链表的末尾成为tail。最后一个节点的下一个指针和前一个节点的上一个指针都为nil。
链表的大多数操作时间复杂度为o(n),比数组要慢,但是比较灵活,不需要那么多内存,复杂度主要在于寻找相应指针的过程,因为它需要从head头开始找起,但是处理起来会很快。单链表比双链表使用更少的内存,它不需要存储所有那些previous指针。双链表每个节点都有一个next和previous指针,如果没有下一个或者前一个节点,这些可以是nil。
(2)跳表
跳表是一个概率数据结构,具有相同的对数时间限制和作为AVL或红黑树的效率,并提供了一个充满的妥协有效地支持搜索和更新操作,能够用相对其他映射数据结构简单的方式来实现。
想要发一篇新博客,先未完待续。。。。。。。。。