232.用栈实现队列

题目

使用栈实现队列的下列操作:

  • push(x) -- 将一个元素放入队列的尾部。
  • pop() -- 从队列首部移除元素。
  • peek() -- 返回队列首部的元素。
  • empty() -- 返回队列是否为空。

示例:

1
2
3
4
5
6
7
MyQueue queue = new MyQueue();

queue.push(1);
queue.push(2);
queue.peek(); // 返回 1
queue.pop(); // 返回 1
queue.empty(); // 返回 false

说明:

  • 你只能使用标准的栈操作 -- 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
  • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
  • 假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。

思路

只能使用栈来实现队列的话,可以使用两个栈.

因为队列的特性是后进后出,而栈的特性是后进先出,要实现后进后出,也就是说最新入栈的元素,要被放到栈底.

所以可以定义一个临时栈,只要有元素进入主栈,就将主栈的所有元素搬到临时栈,在栈底放入新元素,然后再将数据从临时栈搬入主栈.

代码

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<int> stack1 = new Stack<int>();
Stack<int> stack2 = new Stack<int>();
public MyQueue()
{
}
public void Push(int x)
{
while (stack1.Count != 0)
{
stack2.Push(stack1.Pop());//将所有元素从主栈搬到临时栈.
}
stack1.Push(x);//将新元素放入主栈底.
while (stack2.Count != 0)
{
stack1.Push(stack2.Pop());//将所有元素从临时栈搬回主栈.
}
}
public int Pop()
{
return stack1.Pop();
}
public int Peek()
{
return stack1.Peek();
}
public bool Empty()
{
return stack1.Count > 0 ? false : true;
}
}