数组
在计算机内开辟一块连续的内存空间,用于储存数据
优点
- 构建非常简单
- 能在O(1)的时间里根据数组的下标(index)查询某个元素
缺点
- 构建时必须分配一段连续的空间
- 查询某个元素是否存在时需要遍历整个数组,耗费O(n)的时间,n为数组的元素个数
- 删除和添加某个元素时,同样耗费O(n)的时间
链表
- 单链表:链表中的每个元素实际上时一个独立的对象,而所有对象都通过每个元素中的引用字段链接在一起
- 双链表:与单链表不同的是,双链表的每个结点中都含有两个引用字段
优点
- 链表能够灵活的分配内存空间
- 能在O(1)时间内删除或者添加元素,前提是该元素的前一个元素已知;当然页取决于是单链表还是双链表,在双链表中,如果已知该元素的后一个元素,同样可以在O(1)时间内删除或者添加该元素
缺点
- 不像数组能够通过下标迅速读取元素,每次都要从链表的头开始一个一个读取
- 查询第k个元素需要O(k)时间,最大为O(n),即查找最后一个元素
应用场景
如果要解决的问题里面需要很多快速查询,链表可能并不合适;如果遇到问题中,数据的元素个数不确定,而且经常需要进行增加或者删除元素,那么链表会比较合适;如果数据元素大小确定,插入和删除的操作并不多,则数组更加合适
栈
栈最大的特点就是后进先出,对于栈中的数据来说,所有的操作都时在栈的顶部完成的,只可以查看栈顶部的元素,只能够向栈的顶部压入数据,也只能从栈的顶部弹出数据
实现
利用一个单链表来实现栈的数据结构,单链表的表头即为栈顶
如果打算用一个数组外加一个指针来实现相似的效果,那么一旦数组的长度发生变化,那把只是在最后一添加一个新的元素,时间复杂度都不再是O(1),而且,空间复杂度也得不到优化
应用场景
在解决某个问题的时候,只要求关心最近一次操作,并且在完成操作之后,需要向前查找到更前一次的操作
队列
与栈不同,队列最大的特点是先进先出,就好像按照顺序排队一样;对于队列中的数据来说,我们只允许在队尾添加数据,在队头删除数据,而查看两端都可以做到