来源:我的博客站 OceanicKang |《C++ 数据结构(四)栈与队列(2)栈应用(2)栈混洗与括号匹配》
上一篇:《C++ 数据结构(四)栈与队列(2)栈应用(1)进制转换》
典型应用场合
1、逆序输出(conversion)
输出次序与处理过程颠倒,递归深度和输出长度不易预知
2、递归嵌套(stack permutation + parenthesis)
具有自相似性的问题可递归描述,但分支位置和嵌套深度不固定
3、延迟缓冲(evaluation)
线性扫描算法模式中,在预读足够长之后,方能确定可处理的前缀
4、栈式计算(RPN)
基于栈结构的特定计算模式
括号匹配
实例

观察:除了各种括号,其余符号均可暂时忽略

尝试
0、平凡:无括号的表达式是匹配的
1、减治?

2、分治?

然而,根据以上性质,却不易直接应用已知的策略
究其根源在于,1 和 2 均为必要性,比如反例:

构思
颠倒以上思路:消去一对紧邻的左右括号,不影响全局的匹配判断。亦即:

那么,如何找到这对括号?
再者,如何使问题的这种简化得以持续进行?
顺序扫描表达式,用栈记录已扫描的部分
反复迭代:反遇 (,则进栈;凡遇 ),则出栈

实现
bool paren(const char exp[], int lo, int hi) // exp[lo, hi)
Stack<char> S; // 使用栈记录已发现但尚未匹配的左括号
for (int i = lo; i < hi; i

这篇博客探讨了C++中栈在括号匹配和栈混洗问题上的应用。首先介绍了括号匹配的典型问题,通过栈结构实现匹配算法,强调了栈在处理此类问题中的便利性。接着,讨论了栈混洗的概念,计算了不同长度序列的栈混洗数量,并提出了甄别栈混洗的有效算法。文章最后将两者关联,指出每种栈混洗都对应特定的栈操作序列。
最低0.47元/天 解锁文章
栈与队列(2)栈应用(2)栈混洗与括号匹配&spm=1001.2101.3001.5002&articleId=84888012&d=1&t=3&u=b7e57c0be99a40a2b7ebe88b06e92e2e)
620

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



