#LeetCode 232. Implement Queue using Stacks
#LeetCode 232. 视频讲解:栈的基本操作! | LeetCode:232.用栈实现队列_哔哩哔哩_bilibili
Stack 类提供的函数:
push(E item): 将指定元素压入栈顶。
pop(): 移除并返回栈顶的元素。
peek(): 返回栈顶的元素但不移除。
empty(): 判断栈是否为空,为空返回true,否则返回false。
search(Object o): 返回对象在栈中的位置,如果对象不在栈中,则返回-1。
如果使用栈(LIFO)实现队列(FIFO)的功能,需要建立两个栈,stackIn 和stackOut 用于将栈内元素顺序调整为队列顺序。队列会先输出1 ,而栈中会先输出3 。解决这种问题,则用另一个栈,将输出的元素先保存起来,则为队列顺序,如下图:
在pop 中使用另一个函数dumpstackIn 来实现stackIn 到stackOut 的转换。第一个if 容易忘记,是考虑在stackOut 非空时,则代表还有队列前几个元素没有全部pop 出,只有stackOut 为空(代表第一次输入的元素都pop 出了)才会继续放入stackIn 的新元素。如果stackOut 不为空继续放入stackIn 元素,那么在pop 时会出现顺序混乱。
用栈实现队列代码:
class MyQueue {
Stack<Integer> stackIn;
Stack<Integer> stackOut;
public MyQueue() {
stackIn = new Stack<>();
stackOut = new Stack<>();
}
public void push(int x) {
stackIn.push(x);
}
public int pop() {
dumpstackIn();
return stackOut.pop();
}
public int peek() {
dumpstackIn();
int result = stackOut.pop();
stackOut.push(result);
return result;
}
public boolean empty() {
return stackIn.isEmpty() && stackOut.isEmpty();
}
public void dumpstackIn() {
if (!stackOut.isEmpty()) {
return;
}
while (!stackIn.isEmpty()) {
stackOut.push(stackIn.pop());
}
}
}
/**
* 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();
*/
#LeetCode 225. Implement Stack using Queues
#LeetCode 225. 视频讲解:队列的基本操作! | LeetCode:225. 用队列实现栈_哔哩哔哩_bilibili
Queue 接口提供的函数:
boolean add(E e) 和 boolean offer(E e): 将指定的元素插入队列尾部。
E remove() 和 E poll(): 移除并返回队列头部的元素。
E element() 和 E peek(): 返回队列头部的元素但不移除。
int size(): 返回队列中的元素个数。
boolean isEmpty(): 判断队列是否为空。
void clear(): 清空队列中的所有元素。
可以使用一个队列来完成,如图。每次需要输出时是将最后一个元素之前的元素依次放入队列后面,那么余下的第一个元素即为stack 中应该输出的尾部元素。需要注意的是,在top 中,不能直接用peek() 方法来返回队列头部的元素。因为没有移除这个元素,没有修改队列的顺序,如果stack 是123 ,队列中是312 ,是不满足stack 定义的。还是应该通过先pop 出再add 进入。
一个队列完成代码:
class MyStack {
Queue<Integer> queue;
public MyStack() {
queue = new LinkedList<>();
}
public void push(int x) {
queue.add(x);
}
public int pop() {
moveElement();
return queue.remove();
}
public int top() {
moveElement();
int result = queue.remove();
queue.add(result);
return result;
}
public boolean empty() {
return queue.isEmpty();
}
public void moveElement() {
if (queue.size() == 0) {
return;
}
int count = queue.size() - 1;
while (count > 0) {
queue.offer(queue.remove());
count--;
}
}
}
/**
* Your MyStack object will be instantiated and called as such:
* MyStack obj = new MyStack();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.top();
* boolean param_4 = obj.empty();
*/