3.2 队列的基本概念、队列的顺序实现·综合题讲评
约 40 分钟
3.2 综合题:用两个栈实现一个队列
设置输入栈 in 和输出栈 out。入队只压入 in;出队时若 out 非空直接弹出,否则把 in 中所有元素逐个搬到 out,顺序被反转,最早进入者来到 out 顶。两栈都空才是真正队空。
void enqueue(int x){ in.push(x); }
bool dequeue(int& x){
if(out.empty()) while(!in.empty()){out.push(in.top());in.pop();}
if(out.empty()) return false;
x=out.top();out.pop();return true;
}
关键是不在 out 尚有元素时搬运,否则新元素可能跑到旧元素前面,破坏 FIFO。
手工推演:入 1、2、3,第一次出队时搬运后 out 从顶到底为 1、2、3,弹 1;再入 4,此时 in=[4]、out 顶仍是 2,下一次必须弹 2,不能先搬 4。
单次出队最坏 ,但一串操作的均摊成本为 :每个元素至多进入 in 一次、从 in 搬到 out 一次、从 out 弹出一次,总工作与元素数成正比。空间 。
错解反馈:每次出队都来回倒两遍虽能工作却导致反复搬运;只用“最坏 ”否认均摊 ,混淆两种度量;判空只看一个栈会漏掉另一个栈中的元素。
迁移练习:操作 入1,入2,出,入3,出,出 的返回顺序是什么?答案 1、2、3。独立验收:能逐步列出两个栈,并用“每元素最多搬一次”证明均摊复杂度。
小纸条
推演双栈队列:入1、入2、出、入3、出、出,输出顺序是什么?
登录 后可看答案
Practice
本课练习
先独立作答再提交;编程题会在隔离沙箱中真实编译、运行并对拍。
本课练习正在补齐,暂不应标记为完成。