下面给出了使用两个堆栈S1和S2的队列Q的实现:
void insert(Q, x) {
push (S1, x);
}
void delete(Q){
if(stack-empty(S2)) then
if(stack-empty(S1)) then {
print(“Q is empty”);
return;
}
else while (!(stack-empty(S1))){
x=pop(S1);
push(S2,x);
}
x=pop(S2);
}
令n插入和m(<= n)删除操作以任意顺序在空队列Q上执行。令x和y为分别在该过程中执行的推入和弹出操作的数量。对于所有m和n,以下哪一项是正确的?
(A) n + m <= x <2n和2m <= y <= n + m
(B) n + m <= x <2n和2m <= y <= 2n
(C) 2m <= x <2n和2m <= y <= n + m
(D) 2m <= x <2n和2m <= y <= 2n答案: (A)
说明:执行插入和删除操作的顺序在这里很重要。
最好的情况:插入和删除操作是交替执行的。在每个删除操作中,将执行2次弹出操作和1次推送操作。因此,执行了总共m + n次推送(n次推送insert()和m次推送delete())操作和2m次pop操作。
最坏的情况:首先插入n个元素,然后删除m个元素。在第一次删除操作中,执行n + 1个弹出操作和n个推入操作。除第一之外,在所有删除操作中,执行一次弹出操作。因此,总共执行了m + n次弹出操作和2n次推入操作(n次推入insert()和n次推入delete())
这个问题的测验