栈的数据结构就像是子弹弹夹一样,后装入的子弹先发出。
从概念到实战逐步掌握数据结构:通过自定义栈来彻底掌握栈数据结构,并通过自定义栈解决实际问题。
1. 栈的基本概念
1.1. 概念与属性
定义:栈(Stack)是一种“后进先出”(LIFO, Last-In First-Out)的线性数据结构,只允许在一端进行插入和删除操作,这一端称为栈顶(top),另一端称为栈底(bottom)。
栈的数据结构就像是子弹弹夹一样,后装入的子弹先发出。
栈结构如图:

1.2. 核心操作
核心操作主要有入栈push、出栈pop、获取栈顶元素peek,这三个功能为必要功能。
1.2.1. 入栈过程
元素加入及栈顶上移

1.2.2. 出栈过程
元素移除及栈顶下移

1.2.3. 获取栈顶元素
仅返回栈顶元素,不移除栈顶元素

常见方法如下:
push(x):将元素 x 压入栈顶
pop():弹出并返回栈顶元素
peek() / top():仅返回栈顶元素,不移除
isEmpty():判断栈是否为空
size():返回栈大小
通过自定义栈来彻底掌握栈数据结构,并通过自定义栈解决实际问题。
2. 自定义栈
栈对元素的操作是后进先出(LIFO),栈的操作只需要在一端进行入栈(push)和出栈(pop),可以考虑使用链表或数组作为底层数据结构。由于栈没有规定容量大小,使用数组的话需要考虑动态扩容,链表则无需考虑扩容问题。
那就从最简单的单链表入手,编写自定义栈数据结构。
关键思路:每次 push 将新节点插入到链表头部;pop 则移除链表头节点并更新head节点为下一节点。
节点间关系图:top.next-->下一节点

2.1. 自定义栈类--YtyStack
栈的类需要有属性:栈顶(top),栈底(bottom),栈大小(size);其次是栈的必要操作方法:入栈(push),出栈(pop),获取栈顶元素(peek)。
还有些常用操作,比如:栈大小(size),判空(isEmpty),并且为栈加入了格式化输出。
自定义栈 YtyStack类的完整源代码
2.2. 自定义栈测试
测试代码如下
测试结果:做了格式化输出
3. 实战:有效括号匹配
3.1. 问题描述
这是力扣上的一道题目
有效的括号匹配规则:"()"、"()[]{}"、"([])";无效的括号:“)","(]"、"(])"
3.2. 代码实现
入栈左括号,出现右括号时出栈左括号进行匹配,只要三种括号有其一匹配上,则继续进行下去,直到全部都匹配即为有效括号字符串。具体代码实现如下:
3.3. 测试
测试代码如下
需要看到完整的栈操作过程的,可以在实现代码上打开格式化输出处理过程的注释代码。
处理过程:
格式化输出处理过程太长,不在这里贴上去了
4. 总结
栈的数据结构就像是子弹弹夹一样,后装入的子弹先发出。
从概念到实战逐步掌握数据结构:通过自定义栈来彻底掌握栈数据结构,并通过自定义栈解决实际问题。
原创不易,觉得还不错的,三连支持:点赞、分享、推荐↓
1311

被折叠的 条评论
为什么被折叠?



