来源:https://leetcode-cn.com/problems/implement-queue-using-stacks/
使用栈实现队列的下列操作:
push(x) -- 将一个元素放入队列的尾部。
pop() -- 从队列首部移除元素。
peek() -- 返回队列首部的元素。
empty() -- 返回队列是否为空。
示例:
MyQueue queue = new MyQueue();
queue.push(1);
queue.push(2);
queue.peek(); // 返回 1
queue.pop(); // 返回 1
queue.empty(); // 返回 false
解题思路:
用两个栈(S1,S2)模拟一个队列。
入队:都指定入队到第一个栈当中。
出队:1>判断S2当中是否有元素;
2>如果没有,判断S1当中是否有元素,S1有,就把S1当中的元素全部导入S2,在出S2的栈顶元素。S1没有,则队列为空
3>如果S2有元素,直接出S2的栈顶元素。
class MyQueue {
/** Initialize your data structure here. */
private Stack<Integer> stack1;
private Stack<Integer> stack2;
public MyQueue() {
this.stack1 = new Stack<>();
this.stack2 = new Stack<>();
}
/** 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 (empty()){
return -1;
}
if (stack2.empty()){
//导入第一个栈的元素
while (!stack1.empty()){
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
/** Get the front element. */
public int peek() {
if (empty()){
return -1;
}
if (stack2.empty()){
//导入第一个栈的元素
while (!stack1.empty()){
stack2.push(stack1.pop());
}
}
return stack2.peek();
}
/** Returns whether the queue is empty. */
public boolean empty() {
if (stack1.isEmpty()&&stack2.isEmpty()){
return true;
}
return false;
}
}