232 用栈实现队列
题目:
使用栈实现队列的下列操作:
push(x) -- 将一个元素放入队列的尾部。
pop() -- 从队列首部移除元素。
peek() -- 返回队列首部的元素。
empty() -- 返回队列是否为空。
示例:
MyQueue queue = new MyQueue();
queue.push(1);
queue.push(2);
queue.peek(); // 返回 1
queue.pop(); // 返回 1
queue.empty(); // 返回 false
方法:双栈法
思路:新建两个栈,一个为输入栈instack,一个为输出栈outstack,如果执行入栈push操作,就把元素放到输入栈中,如果要移除或者查看首部元素,就先将输入栈的元素导入到输出栈中再移除和查看(从输入栈导输出栈实现了元素的翻转,先进来的在栈的尾部)
逻辑:
输入push:直接进输入栈
移除pop:如果输出栈没有元素,就将输入栈的元素全部移动过来,再输出最上面的元素
查看peck:如果输出栈没有元素,就将输入栈的元素全部移动过来,再查看最上面的元素
代码:
//入栈
private Stack<Integer> instack;
//出栈
private Stack<Integer> outstack;
/** Initialize your data structure here. */
public Queue() {
instack = new Stack<>();
outstack = new Stack<>();
}
/** Push element x to the back of queue. */
public void push(int x) {
instack.push(x);
}
/** Removes the element from in front of queue and returns that element. */
public int pop() {
if(outstack.empty()){
while(!instack.empty()){
outstack.push(instack.pop());
}
}
return outstack.pop();
}
/** Get the front element. */
public int peek() {
if (outstack.isEmpty()) {
while(!instack.isEmpty()){
outstack.push(instack.pop());
}
}
return outstack.peek();
}
/** Returns whether the queue is empty. */
public boolean empty() {
return instack.isEmpty() && outstack.isEmpty();
}