这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战
栈是限定仅在表尾进行插入和删除操作的线性表。
我们将允许插入和删除的一端称为栈顶,另一端称为栈底。
不含任何元素的栈称为空栈。
栈又被称为先进后出的线性表。
也就是说栈是一个特殊的线性表,其只在线性表的表尾进行添加删除数据操作,也就是说上边提到的栈底是固定的,添加删除操作只在栈顶进行。
栈的写入操作,叫做进栈,也称压栈或入栈。
栈的删除操作,叫做出栈,也称弹出栈。
栈限定了只在线性表的末尾进行数据写入删除操作,但是这并不意味着最先进栈的元素一定要最后出栈,这个要看具体情况,举个书上的小例子
【进栈出栈的变化形式】
如果3个整数1,2,3依次入栈,会有哪些出栈次序?
第一种:1-2-3进栈,即3-2-1出栈。
第二种:1进,1出,2斤,2出,3进,3出,进一个出一个,即1-2-3出栈。
第三种:1进,2进,2出,1出,3进,3出,即2-1-3出栈。
第四种:1进,1出,2进,3进,3出,2出,即1-3-2出栈。
第五种:1进,2进,2出,3进,3出,2出,即2-3-1出栈
下边我们来定义栈顺序存储结构的接口:
1 | csharp复制代码/// <summary> |
定义一个类来实现这个接口:
首先定义三个全局变量
1 | csharp复制代码/// <summary> |
这个和线性表(顺序存储结构)是一致的。
这里要说明一下顶栈top这个变量,当栈为空时,其为值-1,因此当想清空栈的时候,不需要将链表循环清空,只需将顶栈置为-1即可。
下方是我整个类的代码:具体调用的实例在文末,可下载:
1 | csharp复制代码public class StackList<T> : IStack<T> |
顺序栈的操作和线性表顺序存储结构相比其实要简单,它的写入和删除操作只发生在表尾,因此在使用它的时候,大概参照线性表的顺序存储结构的用法就好了。
下图是具体调用的实例:
两栈共享空间
栈还有一个在我看来比较高级的用法叫两栈共享空间。
大概是一个栈在表首,一个栈在表尾,每个栈都有一个顶栈。
当两个顶栈彼此相遇的时候,就证明两栈已满,无法再继续操作。
具体代码不在这里进行展示,文末有实例,可下载。
共享栈最后效果如下图所示
有好的建议,请在下方输入你的评论。
欢迎访问个人博客
guanchao.site
欢迎访问小程序:
本文转载自: 掘金