题解 | #用两个栈实现队列#
用两个栈实现队列
https://www.nowcoder.com/practice/54275ddae22f475981afa2244dd448c6
思路
队列是先进先出的线性表,而对于栈来说,它是先进后出的线性表
我们使用两个栈来实现队列功能,即当入队元素时,将其存入其中一个栈(输入栈)中:
- 当出队时,检查当前输出栈中是否有元素,如果没有,判断输入栈中是否存有元素,如果有将输入栈的值全部倒入输出栈中然后出栈栈顶元素。
- 当入队需要检查输出栈中是否有元素,如果有,将输出栈中元素倒入输入栈
- 本来还要做空队列无法出队的,但没有指定空队列应该返回什么值,所以就懒得做了
代码
import java.util.Stack;
public class Solution {
/**
* 输入栈
*/
Stack<Integer> inputStack = new Stack<>();
/**
* 输出栈
*/
Stack<Integer> outputStack = new Stack<>();
/**
* 入队方法
*
* @param node 入队元素
* @apiNote
* @since 2023/1/7 18:10
*/
public void push(int node) {
// 检查输出栈是否为空
if (!outputStack.isEmpty()) {
// 如果输出栈不为空,将输出栈中的数据倒回输入栈
transfer(inputStack, outputStack);
}
// 将元素入栈
inputStack.push(node);
}
/**
* 出队方法
*
* @return int
* @apiNote
* @since 2023/1/7 18:11
*/
public int pop() {
// 检查输出栈是否为空
if (outputStack.isEmpty()) {
if (!inputStack.isEmpty()) {
// 如果输出栈为空,输入栈不为空,将输入栈中的数据倒入输出栈
transfer(outputStack, inputStack);
}
}
return outputStack.pop();
}
/**
* 栈转移方法
*
* @param mistressors 转移者
* @param thoseWhoAreTransferred 被转移者
* @apiNote 将一个栈的数据倒入另一个栈中,并将前者清空
* @since 2023/1/7 18:27
*/
public void transfer(Stack<Integer> mistressors,
Stack<Integer> thoseWhoAreTransferred) {
while (!thoseWhoAreTransferred.isEmpty()) {
mistressors.push(thoseWhoAreTransferred.pop());
}
}
}