Cracking Coding Interview - 3.4 Queue of Stacks

Queue via Stacks: Implement a MyQueue class which implements a queue using two stacks.

解答

两个Stack,如果把一个Stack的元素pop然后push到另外一个Stack上,那么顺序就会发生颠倒。

Stack是FILO,Queue是FIFO,那么很自然的可以想到利用这两个Stack来实现Queue。

1
2
3
4
5
  IN     OUT
   4      1
   3      2
   2      3
   1      4

当Queue中添加元素的时候,把OUT都移到IN里,然后在IN的顶部push。

当Queue中拿出元素的时候,把IN都移到OUT里,然后在OUT的顶部push。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class MyQueue {

  Stack in = new Stack();
  Stack out = new Stack();
  
  public void add(Object value) {
    drain(out, in);
    in.push(value);
  }

  public T remove() {
    drain(in, out);
    return out.pop();
  }
  
  public T peek() {
    drain(in, out);
    return out.peek();
  }

  private void drain(Stack from, Stack to) {
    if (from.isEmpty()) {
      return;
    }
    Object v = from.pop();
    while (v != null) {
      to.push(v);
      v = from.pop();
    }
  }

}

版权

评论