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

📅  最后修改于: 2021-09-08 13:25:51             🧑  作者: 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 是进程中分别执行的 push 和 pop 操作的数量。以下哪一项对所有 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答案:(一)
说明:执行插入和删除操作的顺序在这里很重要。
最好的情况:插入和删除操作交替执行。在每次删除操作中,执行 2 次弹出和 1 次推送操作。因此,总共执行了 m+ n push(n push for insert() 和 m push for delete())操作和 2m pop 操作。

最坏的情况:首先插入 n 个元素,然后删除 m 个元素。在第一次删除操作中,进行了 n+1 次弹出操作和 n 次推送操作。除第一次外,在所有删除操作中,执行一次弹出操作。因此,总共执行了 m + n 个 pop 操作和 2n 个 push 操作(n push 用于 insert() 和 n push 用于 delete())
这个问题的测验