[LeetCode]232. 用栈实现队列(java实现)
1. 题目
2. 读题(需要重点注意的东西)
要求时间复杂度为O(n)—不能又复杂的多层循环
栈的特性—先进后出
思路:使用两个栈stackIn作为输入栈,stackOut为输出栈,将stackIn中的元素pop出来,push到stackOut中,此时,stackOut栈可以视为一个队列。
3. 解法
class MyQueue {
private Stack<Integer> stackIn;
private Stack<Integer> stackOut;
/** Initialize your data structure here. */
public MyQueue() {
stackIn = new Stack<>();
stackOut = new Stack<>();
}
/** Push element x to the back of queue. */
// 入队,将元素暂时保存再输入栈中
public void push(int x) {
stackIn.push(x);
}
/** Removes the element from in front of queue and returns that element. */
// 出队
// 如果输出栈为空,将输入栈保存的元素pop出来,存在输出栈中,再进行输出;这样,就完成了先入先出
public int pop() {
if(stackOut.empty()){
while(!stackIn.empty()){
stackOut.push(stackIn.pop());
}
}
return stackOut.pop();
}
/** Get the front element. */
// 返回队首元素,不删除
public int peek() {
// 如果输出栈为空,将输入栈保存的元素pop出来,存在输出栈中,再进行输出;这样,就完成了先入先出
if(stackOut.empty()){
while(!stackIn.empty()){
stackOut.push(stackIn.pop());
}
}
return stackOut.peek();
}
/** Returns whether the queue is empty. */
public boolean empty() {
return stackIn.empty() && stackOut.empty();
}
}
/**
* Your MyQueue object will be instantiated and called as such:
* MyQueue obj = new MyQueue();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.peek();
* boolean param_4 = obj.empty();
*/
4. 可能有帮助的前置习题
5. 所用到的数据结构与算法思想
6. 总结
应用了栈的特性—先进后出,以及队列的特性—先进先出,设计了两个栈来协同完成队列的先进先出的功能。