3.2.4 双端队列
约 40 分钟
3.2.4 双端队列:受限端点决定可生成序列
双端队列允许在两端插入和删除。输入受限双端队列只允许一端插入、两端删除;输出受限则允许两端插入、只从一端删除。普通栈和普通队列都可看作进一步限制操作后的特例。
判断输出序列不能只套栈的 LIFO。应逐个处理输入元素,在允许的端点插入;每次目标输出若位于允许删除的任一端即可取出,否则继续输入或宣告失败。草稿用一条横线画 deque,明确左端和右端。
用循环数组实现时可维护 front 指首元素、rear 指尾元素的下一位置。左端入队先令 front=(front-1+CAP)%CAP 再写;右端入队先写 rear 再递增。左右删除分别移动 front 或反向移动 rear。仍要选择牺牲槽位或维护长度来区分空满。
手工推演:输入受限,只能从右端依次插入 1、2、3,但可两端删除。想输出 1,3,2:插入 1 后从左删 1;再插入 2、3,从右删 3,再删 2,合法。想在已有 [1,2,3] 时先删 2 不可能,因为它不在端点。
错解反馈:把 deque 当成可随机删除中间元素;忘记输入受限与输出受限限制的是哪种操作;循环数组左移直接 front--,在 0 处会产生负下标。
迁移题:输出受限双端队列固定从左端删除,输入 1、2、3 能否输出 3,1,2?答案可:右入 1、右入 2、左入 3,随后从左依次删除。独立验收:能列出四种端点操作中哪些被允许,并逐步构造或证明失败。
小纸条
判断:输入受限双端队列依次输入1、2、3,输出1、3、2是否可能?
登录 后可看答案
Practice
本课练习
先独立作答再提交;编程题会在隔离沙箱中真实编译、运行并对拍。
本课练习正在补齐,暂不应标记为完成。