Implement the following operations of a queue using stacks.
- push(x) — Push element x to the back of queue.
- pop() — Removes the element from in front of queue.
- peek() — Get the front element.
- empty() — Return whether the queue is empty.
Example:
MyQueue queue = new MyQueue();queue.push(1);queue.push(2);queue.peek(); // returns 1queue.pop(); // returns 1queue.empty(); // returns false
Notes:
- You must use only standard operations of a stack — which means only
push to top,peek/pop from top,size, andis emptyoperations are valid. - Depending on your language, stack may not be supported natively. You may simulate a stack by using a list or deque (double-ended queue), as long as you use only standard operations of a stack.
- You may assume that all operations are valid (for example, no pop or peek operations will be called on an empty queue).
题意
用栈来实现队列的功能。
思路
需要用到两个栈,有两种方法:
方法1:只在stack1进行push;只在stack2进行pop和peek,当stack2空时,则将stack1中所有元素依次出栈并压入stack2中,再进行pop和peek。
方法2:每次push新元素x时,将stack1中所有元素依次出栈并压入stack2中,将x压入stack1,再将stack2中所有元素依次出栈并压回stack1中,这样就能保证任何时候stack1要进行pop时都是先进先出。
代码实现 - 方法1
class MyQueue {Deque<Integer> stack1;Deque<Integer> stack2;/** Initialize your data structure here. */public MyQueue() {stack1 = new ArrayDeque<>();stack2 = new ArrayDeque<>();}/** Push element x to the back of queue. */public void push(int x) {stack1.push(x);}/** Removes the element from in front of queue and returns that element. */public int pop() {if (stack2.isEmpty()) {while (!stack1.isEmpty()) {stack2.push(stack1.pop());}}return stack2.pop();}/** Get the front element. */public int peek() {if (stack2.isEmpty()) {while (!stack1.isEmpty()) {stack2.push(stack1.pop());}}return stack2.peek();}/** Returns whether the queue is empty. */public boolean empty() {return stack1.isEmpty() && stack2.isEmpty();}}
代码实现 - 方法2
class MyQueue {Deque<Integer> stack1;Deque<Integer> stack2;/** Initialize your data structure here. */public MyQueue() {stack1 = new ArrayDeque<>();stack2 = new ArrayDeque<>();}/** Push element x to the back of queue. */public void push(int x) {while (!stack1.isEmpty()) {stack2.push(stack1.pop());}stack1.push(x);while (!stack2.isEmpty()) {stack1.push(stack2.pop());}}/** Removes the element from in front of queue and returns that element. */public int pop() {return stack1.pop();}/** Get the front element. */public int peek() {return stack1.peek();}/** Returns whether the queue is empty. */public boolean empty() {return stack1.isEmpty();}}
