题干
用两个栈来实现一个队列,分别完成在队列尾部插入整数(push)和在队列头部删除整数(pop)的功能。 队列中的元素为int类型。保证操作合法,即保证pop操作时队列内已有元素。
示例:
输入:
[“PSH1”,“PSH2”,“POP”,“POP”]
返回:
1,2
解析:
“PSH1”:代表将1插入队列尾部
“PSH2”:代表将2插入队列尾部
"POP“:代表删除一个元素,先进先出=>返回1
"POP“:代表删除一个元素,先进先出=>返回2
解题思路
栈的特点是先进后出
,类似于一个瓶子,而队列的特点是先进先出
,类似于一根管子,所以现在的问题可以等价于怎么把两个瓶子变成一个管子?我们的思路是进永远从瓶子1进,出永远从瓶子2出,但是瓶子2为空的时候,需要把瓶子1里面的元素先倒到瓶子2里,然后再出。这样就能保证瓶子2出的元素永远是最先进去的元素。
示例代码
import java.util.Stack;
public class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
stack1.push(node);
}
public int pop() {
if(stack2.isEmpty()){
while(!stack1.isEmpty()){
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
}
举一反三
类似的,还会有使用两个队列来实现栈的考题,其核心思路就是想办法让“后进“变“先进”,每次进的时候先进为空的队列,然后把另一个不为空的队列里的元素依次灌到此队列中,这样就保证入的时候有一个队列是空的,出的时候从不为空的队列中取元素。 具体的编码自己动手试试看看吧~~