一、认识栈结构
栈是一种 非常常见 的 数据结构,它在程序中的 应用非常广泛
数组
1)我们都知道数组是一种线性结构,并且可以在数组的 任意位置 插入和删除元素。
2)但是有时候,我们为了实现某些功能,必须对这种 任意性 加以 限制。
3)而 栈和队列 就是比较常见的 受限的线性结构
栈结构示意图
栈(stack),它是一种受限的线性表,它是后进先出(LIFO)
1)其限制是仅允许在 表的一端 进行插入和删除运算。而这一端被称为 栈顶,相对的,把另一端称为 栈底
2)LIFO(last in first out)表示就是后进入的元素,第一个弹出栈空间。它就类似于自动餐托盘,最后放上去的托盘,往往先拿出去使用。
3)向一个栈插入新元素又称作 进栈、入栈 或 压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素。
4)从一个栈删除元素又称作 出栈 或 退栈,它是把栈顶元素删除掉,使之相邻的元素成为新的栈顶元素
举例:生活中类似于栈的
如:
自助餐的托盘,最新放上去的,最先被客人拿走
收到的很多的实体邮件,从上往下依次处理这些邮件(最新到的邮件,最先处理); 另外要注意一点的就是:不允许改变邮件的次序,比如从最小开始,或者处于最紧急的邮件,否则就不再是栈结构,二十队列或者优先级队列结构
程序中什么是使用栈实现的?
比如:函数调用栈
函数之间可以相互调用:例如 A 调用 B ,而 B 中又调用 C , C 中又调用 D
这样的话在执行过程中,会先将 A 压入栈中,但是 A 又没执行完,所以不会弹出栈
而在 A 执行的过程中调用了 B ,也会将 B 压入栈中 , 而这个时候 B 是在栈顶 , A 在栈底
如果这个时候 B 执行完 , 那么 B 会弹出栈 , 但是 B 没执行完,所以又调用了 C
而 C 压入栈后 , 会在栈顶 , 而后 C 又调用了 D , D也会压入栈 , 并且出现在栈顶
所以当前的栈顺序是(从栈底到栈顶):栈底 A -> B -> C -> D 栈顶
而当 D 执行完后 , 会弹出栈 ,之后的 C / B / A 会依次弹出栈
所以我们有函数调用栈的称呼 , 就来自于它们内部的实现机制 ,也就是通过栈来实现的
示例图:
栈结构的实现
实现栈结构有两种比较常见的方式:
基于数组实现 基于链表实现
栈中常见的操作:
push(element): 添加一个新元素到栈顶位置
pop0 : 移除栈顶的元素,同时返回被移除的元素
peek0 : 返回栈顶的元素,不对做任何修改( 这个方法不会移除栈顶的元素,仅仅返回它).
isEmpty0 : 如果里没有任何元素就返回true,否则返回false。
size0 : 返回栈里的元素个数。这个方法和数组的length属性很类似口 toString0: 将栈结构的内容以字符形式返回
toString : 将栈结构的内容以字符形式返回
基于数组实现示例:
封装栈类:
栈的相关操作示例:
作者:空庭碎烟
链接:juejin.cn/post/721143…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。