前言:数据结构就是数据的组织方式。常见的几种数据结构有栈、队列、链表、数组、树、图、堆等。今天来说一下栈和队列的比较,以及链表和数组的比较。
1、栈和队列
(1)栈
我们常听见说栈内存,那么栈内存中的数据是如何存储的呢?
数据在栈内存中存入时的方式称为“压栈”,取出的方式称为“弹栈”。这种方式使得栈很像武器枪上的弹夹,像下边:
数据 a 最先存入栈中,然后存入 b ,a 就自动存储到 b 的下边,存入 c 的时候,a 和 b 再存入到下边。当取出的时候,首先取出的是 c ,然后是 b ,最后是 a 。
(2)队列
队列的存取方式见下图:
数据 a 先存入队列中,然后存入 b ,此时 a 也会存入后面一格,接着存入 c ,a 和 b 都依次向后存入一格。取出的时候 a ,首先出来,然后是 b ,最后是 c 。
比较:栈中,进出口都是一个,存取特点是先进后出;而对于队列来说,则出入口不同,存取特点是先进先出。
2、数组和链表
(1)数组
首先定义一个数组:int [ ] arr = { 23 , 45 ,87 , 19 , 52 } ,如图:
需求1:我想获取87这个元素,怎么办?
我们可以直接获取 arr [ 2 ] 。
需求2:我想在87后边添加一个元素63,怎么办?
这个就要分步骤做了:
a:创建一个新数组,长度比以前大1。
b:遍历旧数组,找到87,在87之前的元素一次存入新数组,存入87之后紧接着存入63,然后的元素在新数组中索引加1再存入。
需求3:我想删除87这个元素,怎么办?
a:创建一个新数组,长度比以前小1。
b:遍历旧数组,找到87,在87之前的元素一次存入新数组,87之后的元素在新数组中索引减1再存入。
(2)链表链表就是把一些节点通过链子链接起来的数据结构,那么什么是节点呢?
节点:由指针域和数值域组成。每个节点的指针域都保存着下一个节点的地址。
如果将{ 23 , 45 ,87 , 19 , 52 } 存储在链表中,如图:
需求1:我想获取87这个元素,怎么办?
从头遍历,直到找到87,因为链表没有角标,每一个节点都能找到下一个节点,但是永远不知道下一个节点保存的什么,所以每找一个数值都要从头遍历。
需求2:我想在87后边添加一个元素63,怎么办?
直接添加一个数值域为63的节点,然后将87节点的指针域保存63节点的地址,63节点的指针域保存19节点的地址即可,如下图:
需求3:我想删除87这个元素,怎么办?
原理相同,去掉一个节点即可。
比较:数组的特点是查询快,增删慢;链表的特点是查询慢,增删快。小结:每种数据结构都有各自的特点,一种优点的突出也就意味着一种缺陷的严重,所以在使用时要按照考虑数据结构的特点来使用。