[数据结构][栈]栈基本操作总结与相关链接 原创
A.注释
1. 熟练掌握栈的定义、特性和栈的抽象数据类型,
2.定义
是 限定 仅在队尾 进行插入或删除操作的 先行比爱
3.特性
3.1表尾端 栈顶 top
3.2后进先出 原则
抽象数据类型
P57
4.栈与递归的关系
4.1.1递归
4.1.1.1定义是递归的
解释:存在一个函数 过程 数据结构 定义的内部 直接或者间接 出现定义本身的应用, 则称为递归的
适用于:阶乘 分治法 等
4.1.1.2数据结构是递归的
LNode 结点 由 data next 组成,而next本身是一种指向LNode 的指针 即LNode定义中调用了自身, 所以连表示一种递归的数据结构
链表 二叉树
4.1.1.1.3问题的解法是递归的
问题本身没有明显的递归结构,但是递归求解比迭代求解更加简单
Hanoi 八皇后 迷宫
5.关系
函数执行中,需要多次自我调用
调用函数和被调用函数之间的连接及信息交换需要通过栈来进行
多个函数嵌套调用时,按找“先调用后返回”的原则,函数之间的信息传递和控制转移必须由 栈 来进行,及系统将整个程序运行时所需要的数据空间安排在一个栈当中,没调用一个函数就在站定分配一个储存区,当一个函数退出时,就是放它的储存区,则当前执行的函数的数据必然在栈顶
B.栈的基本操作和相关链接
进制转换 | 括号匹配 |
---|---|
数组模拟栈及其基本操作 | 链表模拟栈及其基本操作 |
N表达式求值 |
C.编写日志
1.
sqStack 中 感觉很顺利
不得不说 我他妈逐渐原谅了 书上的代码
仔细看看(并不是很仔细) 也挺有道理的
&s 直接改变本身 这个还是想提一下
&e 直接返回给自己
Elem *base; Elem *top; 两个指针的用法与好处还是非常明显 毕竟我之前用顺序栈的时候都是直接刚过去...... 那想过这个
*s.top++ = e; 这种简写方式 初看也是有点蛋疼的 真牛皮啊 不得不想起 >>1 这种蛋疼操作
2.
进制转换部分
在输出结果部分一直出错 一支无输出结果
神奇
排查之后 发现是 while (!(StackEmpty(s))) 返回结果
-1 取反 为0
真实
太真实了
Status StackEmpty 空时 返回值改为 return 0 就OK
就这都坑了我半小时?...
另外 书上的 Status conversion(int N) 感觉不全
改为
Status conversion(sqStack &s, int n, int key)
{
InitStack(s);
while (n)
{
Push(s, (n%key));
n /= key;
}
while (!(StackEmpty(s)))
{
Elem e;
Pop(s, e);
cout << e;
}
return 1;
}
书上 无 StackEmpty(s) 添加为
Status StackEmpty(sqStack &s)
{
if (s.top == s.base)
return 1;
else return 0;
}
3.括号匹配
这个题 好理解 是真的好理解
看输入 选择 加flag 关门
但是我犯了几个小错误 不得不提
3.1 视频代码 的 ‘(’||‘[’是错误的!
3.2 真的要加break 不然我 pop 连续两下 人都傻了
3.3 原本我是 Status GetTop 这里有问题 返回值 所以我改成了 Elem GetTop 啊 以前感觉是装逼用的 elem 现在察觉真好用啊 大家一次解决
4.
理解是理解啊 看着是真麻烦
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App