开场白
上一节讲了数据结构中的线性表,本节对另外一个结构,栈和队列解析解析理解。
栈限定仅在表尾进行插入和删除操作的线性表。后进先出
队列是只允许在一段进行插入操作、而在另一端进行删除操作的线性表。 先进先出
栈的定义
栈是限定仅在表尾进行插入和删除操作的线性表。允许插入和删除的一端称为栈顶,另一段 称为栈底。不含任何元素的栈叫空栈。栈又称为后进先出的线性表
栈的插入操作叫进栈,或称 压栈、入栈;栈的删除操作饺子出栈、也叫做弹栈
栈的顺序存储结构及实现
也就是用一个数组来实现栈的操作,数组的a[0] 作为栈的底部, 每次加入元素和删除元素都从数组的尾部进行操作,因此该操作的复杂度都为O(1)
栈的链式存储结构及实现
用单链表来实现
栈的栈顶来做插入和删除操作,栈顶放在链表的头部还是尾部呢?由于单链表有头指针,而栈顶指针也是必须的,所以链表的头部作为栈顶
对于链表实现的栈,基本不会出现栈满的情况,除非内存空间不够 了。
对于进栈操作,也就是将原来的头指针指向进栈元素,同时进栈元素的下一个节点是上一次的头元素。
对于出栈操作,也就是将原来的头指针指向出栈元素的下一个节点,同时删除该元素。
栈的作用:
上面讲了栈的功能可以用顺序表或链表来实现,那为啥还引用链表这种结构?
其实这相当于自行车、火车等交通工具方便了我们的出行是一个道理。栈也给我们某些应用场景提供了方便。
栈的应用
------递归
递归是我们程序中经常用到的方法,
以下是著名的裴波那契公式
要计算 n 的值,需要计算n-1 , n-2的值。依次类推,
栈的应用2---四则运算
1后缀表达式计算,比如计算式 9+(3-1)*5+10/2
后缀表达式的意思是,所有的运算符都要在运算数字的后面出现,则上面的表达式的后缀表达式为 :9 3 1 -5 *+10 2/ +
其进栈的流程为:(遇到运算符的就将栈顶的两个元素取出进行计算,计算完成返回栈顶)
中缀表达式:平时我们写的表达式就是中缀表达式。中缀表达式怎么转换为后缀表达式?
栈的应用--jvm 加载方法
java 在调用一个方法的时候,会调用方法中引用的方法,直到最后一个函数。
其实它对的本质就是采用了栈的特性。
队列的定义
队列是只允许一端进行插入操作,而在另一端进行删除操作的线性表。是一种先进先出的线性表。
队列的存储也可以采用顺序存储结构或者是链式存储结构来实现。
总结
本章对 栈和队列这种数据结构进行了讲解,其本质是一种特殊的 线性表。栈是一种后进先出的结构,队列是一种先进先出的数据结构。同时也对栈和队列的一些应用场景进行了介绍。