之前已经说过,数据结构是数据的一种组织形式,根据不同的需求就会出现不同的数据结构,栈和队列就是两种特殊的线性表数据结构,Android四大组件之一Activity的就是以栈的结构组织的。
栈
其可定位为只允许在表的末端进行插入和删除的线性表,遵循后进先出的规则。在这个规则之下,基于数组的存储表示实现的栈成为顺序栈,基于链表的存储表示实现的栈成为链式栈。
顺序栈的实现在于使用了数组这个基本数据结构,数组中的元素在内存中的存储位置是连续的,且编译器要求我们在编译期就要确定数组的大小,这样对内存的使用效率并不高,一来无法避免因数组空间用光而引起的溢出问题,二在系统将内存分配给数组后,则这些内存对于其他任务就不可用;而对于链式栈而言,使用了链表来实现栈,链表中的元素存储在不连续的地址,由于是动态申请内存,所以我们可以以非常小的内存空间开始,另外当某个项不使用时也可将内存返还给系统。
队列
队列是另一种限定存取位置的线性表,它只允许在表的一端插入,在另一端删除。队列也有基于数组的存储表示和基于链表的存储表示。
循环队列
一开始设计队列是形状像一栋楼那样,从上面进来到一、二、三层,等一层走了之后,二、三层不会自动下来,有新的会在第四层增加,当指针到达MaxSize的时候,即顶楼貌似这个队列就已经满了,而实际上前面还有些楼层是空的,所以才出现了循环队列。它是一个顺序队列的变形。
链式队列
队列的对头指针front指向单链表的第一个结点,对尾rear指针指向单链表的最后一个结点。它遵循队列的先进先出规则,只是结构是单链表结构。其特别适合于数据元素变动比较大的情形,而且不存在队列慢而残神工艺处的情况。
优先级队列
前面介绍的队列的规则都是FIFO,但是,许多应用需要另一种队列,每次从队列中取出的应是具有最高优先权的元素。
不明白:既然是遵守FIFO规则的才叫队列,现在又来个优先级,那么不是破坏了原有的规则了吗?
解释:在将元素插入队列的时候,会按照优先级将元素排列好,然后第一个元素是优先级最高的,最后一个是优先级最底的,结果就同时遵守了FIFO和优先级最高先出的规则。
双端队列
与前面介绍的队列不同,这个队列是允许在两端进行插入和删除的,相对队列两头来说,还是遵守了FIFO的规则。
递归
若一个对象部分地包含它自己,或用它自己给自定定义,则成这个对象是递归的;而且若一个过程直接地或间接地调用自己,则称这个过程是递归的过程。