📜  数据结构|队列|问题11

📅  最后修改于: 2021-06-29 00:35:29             🧑  作者: Mango

下面给出了使用两个堆栈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())
这个问题的测验