栈结构

176 阅读3分钟

一、认识栈结构

栈是一种 非常常见 的 数据结构,它在程序中的 应用非常广泛

数组

1)我们都知道数组是一种线性结构,并且可以在数组的 任意位置 插入和删除元素。

2)但是有时候,我们为了实现某些功能,必须对这种 任意性 加以 限制

3)而 栈和队列 就是比较常见的 受限的线性结构

栈结构示意图

Snipaste_2023-03-17_10-48-49.png

栈(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 会依次弹出栈

所以我们有函数调用栈的称呼 , 就来自于它们内部的实现机制 ,也就是通过栈来实现的

示例图:

Snipaste_2023-03-17_11-22-26.png

栈结构的实现

实现栈结构有两种比较常见的方式:

基于数组实现 基于链表实现

栈中常见的操作:

push(element): 添加一个新元素到栈顶位置

pop0 : 移除栈顶的元素,同时返回被移除的元素

peek0 : 返回栈顶的元素,不对做任何修改( 这个方法不会移除栈顶的元素,仅仅返回它).

isEmpty0 : 如果里没有任何元素就返回true,否则返回false。

size0 : 返回栈里的元素个数。这个方法和数组的length属性很类似口 toString0: 将栈结构的内容以字符形式返回

toString : 将栈结构的内容以字符形式返回

基于数组实现示例:

封装栈类:

Snipaste_2023-03-17_17-03-25.png

栈的相关操作示例:

Snipaste_2023-03-17_18-41-53.png

作者:空庭碎烟
链接:juejin.cn/post/721143…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。