题目
使用栈实现队列的下列操作:
- 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; } }
|