![](https://csdnimg.cn/release/download_crawler_static/86331509/bg4.jpg)
习题[4-3] 第4章 栈不队列
该算法尽管包含两重循环,但其中实质的push()和pop()操作均不超过O(n)次,故其总体
时间复杂度应线性正比于输入序列的长度。
算法x4.1只需略作修改,即可实现对栈混洗的甄别:对于{ 1, 2, 3, ..., n }的任一排
列,判定其是否为栈混洗。请读者参照以上分析以及注释,独立完成此项工作。当然,你所改进
的算法,必须依然具有O(n)的时间复杂度。
b) 若对仸意 1 i < j < n,B 中都丌含模式:
{ ..., j + 1, ..., i, ..., j, ...}
则 B 是否必为 A 癿一个栈混洗?若是,试给出证明;否则,试丼一反例。
【解答】
可以证明此类序列B必为A的一个栈混洗,故亦可将:
{ j + 1, i, j }
视作新的一类禁形。为此,不妨将:
{ k, i, j }
{ j + 1, i, j }
分别称作“915”式禁形、“615”式禁形。
显然,此类禁形是a)中禁形的特例,故只需证明“当”:只要B中含有“915”式禁形,则
必然也含有“615”式禁形当然,两类禁形中的i和j未必一致。
以下做数学归纳。假定对于任何的k - i < d,以上命题均成立,考查k - i = d的情况。
不妨设i < j < k - 1,于是元素k - 1在B中相对于i的位置无非两种可能:
1)k - 1居于i的左侧(前方)
此时,{ k - 1, i, j }即为“915”式禁形,由归纳假设,必然亦含有“615”式禁形。
2)k - 1居于i的右侧(后方)
此时,{ k, i, k - 1 }即构成一个“615”式禁形。
c) 若对仸意 1 < j < k n,B 中都丌含模式
{ ..., k, ..., j - 1, ..., j, ...}
则 B 是否必为 A 癿一个栈混洗?若是,试给出证明;否则,试丼一反例。
【解答】
此类序列B未必是A的一个栈混洗,故不能将“945”式特征:
{ k, j - 1, j }
称作禁形。作为反例,不妨考查序列:
B[] = { 2, 4, 1, 3 }
不难验证,其中不含任何的“945”式模式({ 3, 1, 2 }、{ 4, 1, 2 }、{ 4, 2, 3 })。
但反过来,若对序列B[]应用算法x4.1,却将导致错误(请读者独立验证这一点,并指出错误的
位置及原因),这说明该序列并非A的栈混洗。