数据结构
一个家族为数据结构,我的家族是一个庞大的家族。家族中也有几大分支,比如说树、图、堆、散列表等。各个分支都有不同的能力,所以很多人选择适当的数据结构是一项很重要的工作。我们家族和算法家族是世交,基本上所有重要场合两家都会一起出现。
- 我叫栈,我的爸爸叫数组,我的妈妈叫链表,我的双胞胎弟弟叫队列。我们这个家庭是整个数据结构家族中比较重要的家庭。
数组
说起我的爸爸——数组,他是数据结构家族的族长,人们都说他是数据结构大家族的根基。很多编程语言都内置数组。
数组在存储数据的时候会预先划分一块连续的内存 , ++然后把数据按顺序存储到这些连续的内存中,当取数据的时候,需要给数组提供数据,就是数组的位置索引++。并不是所有的数据数组都会存储,只会存储相同类型的数据
数组数据结构是由相同类型的元素(element)的集合所组成的数据结构,分配一块连续的内存来存储。利用元素的索引(index)可以计算出该元素对应的存储地址。
所有的数据结构都支持 插入, 删除 ,读取
因为数组在存储数据的时候,是按照顺序保存的, 特点就是读取数据比较快,直接根据索引去查找, 而插入和删除比较慢, 因为不管是插入还是删除, 只要操作数组中的其中一个位置,那个位置后面的位置的所有数据的索引都要逐一去罗移位置
链表
由于数组爸爸有寻址容易,插入和删除困难的问题,他在找老婆的时候特意找了一个和自己互补的姑娘——链表。
链表就是查找慢,插入和删除快
链表存储数据是有两块区域的,一块是存储数据, 一块是用来记录数据保存的指针。 这样存储数据的时候,他直接去找空余的空间,然后存储数据,然后再把上一个数据指针指到这个数据的地址值
链表是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里保存着下一个节点的指针。
这样的保存数据方式就使插入和删除数据的时候非常快, 只需要修改指针的下一个值的地址值就好,然后查找数据的时候,只能从头找到尾,所以特别慢
栈 和 队列
我和队列是一堆孪生兄弟。我们两个都可以用数组和链表来实现。虽然是双胞胎,但是我们两个都是有性格的,我们要求别人存储数据和取出数据的顺序要按照我们的规矩来。
栈 : 先进后出
队列 : 先进先出
我给你举个例子你就明白了,我和弟弟每个人都有一个管子,用来帮你们保存数据,当然这个管子可能是用数组爸爸是实现的也可能是链表妈妈实现的。我们握住管子的两头,我的这个管子只能通过管子左面的口子放入东西,也只能从左面的口子取出东西。右面的口子是不开的。而弟弟队列呢,他的管子的左面的口子放东西,管子的右面的口子取东西。