前言
今天是大年初三,在广州过的第四个还是第五个年了,已经忘了,中午吃完饭看书大话数据结构的这本书的栈与队列的关于栈的这篇文章。就去电影看黄渤演的疯狂的外星的人这部喜剧片。笑点还是挺多的。整部电影以外星文明想和人类建交而为起点。外星人在太空中意外坠楼到黄渤的训猴的马戏团。导致黄渤相依为命的猴子受伤无法继续表演。而外星人坠落时晕过去了。黄渤拿走了外星人超能力的能量环。黄渤误以为他稀有的猴子品种,把他当猴子训练发生的一系列啼笑皆非的故事。
栈与队列的概述
- 栈是限定仅在表尾进行插入和删除操作的线性表 。
- 队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表
栈的定义
- 我们把允许插入和删除的一端称为栈顶(top) ,另一端称为核底 (bottom),不含任何数据元素的称为空钱。栈又称为后进先出 (LastIn FilrstOut) 的线性表,简 称 LlFO 结构 。
- 首先它是一个统性表 ,也就是说,栈元素具有线性关系,即前驱后继关系。只不过它是一种特殊的线性表而已。定义中说是在线性表的表尾进行插入和删除操作,这里表尾是指栈顶 ,而不是栈底 。
栈的顺序存储结构
- 栈的顺序存储其实也是线性表顺序存储 的简化,我 们简称为顺序栈。下标为 0 的一端作为栈底比较好,因为首元素都存在栈底,变化最小,所以让它作栈底 。
顺序栈代码实现
1 |
|
栈的链式存储结构
- 栈的链式存储结构简称为链栈。通常栈顶是放在单链表的头部,对于链栈来说,是不需要头结点的。
- 对于链栈来说,基本不存在栈满的情况,除非内存已经没有可以使用的空间
- 对于空栈来说,链表原定义是头指针指向空 , 那么链栈的空其实就是
top=null
的时候。
进栈思路
让栈顶top指向新创建的元素,并且新元素的next指针指向原来的栈顶元素
出栈思路
出栈就是把当前栈顶替换为栈顶的next指向的结点。然后释放原栈顶的next引用
链栈代码实现
1 |
|
栈的应用(递归)
斐波那契数列实现
说如果兔子在出生两个月后,就有繁殖能力, 一对兔子每个月能生出一对小兔子 来。假设所有兔都不死,那么一年以后可以繁殖多少对兔子呢?
我们拿新出生的一对小兔子分析一下;第一个月小兔子没有繁殖能力,所以还是 一对 i 两个月后,生下一对小兔子数共有两对; 三个月以后,老兔子又生下一对,因 为小兔子还没有繁殖能力 , 所以一共是三对……依次类推可以列出下表(表 4-8-1)。
前面相邻两项之和,构成了后一项
1 | public class DiGuiTest { |