题目描述:
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
解法一:
import java.util.Stack;
public class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
while(!stack2.isEmpty()) {
stack1.push(stack2.pop());
}
stack1.push(node);
}
public int pop() {
while(!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
return stack2.pop();
}
}
每次来一个元素需要进队列时候,1号栈先把所有的2号栈的元素取过来,再把待进栈元素存入1号栈。
出队列时,将所有1号栈的元素娶过来放到2号栈,然后再把2号栈元素取出一个来。
在看了其他解法之后发现这种解法较为繁琐,因为其核心就是1号栈存元素,2号栈取元素。所以产生解法二。
运行时间:18ms(不稳定)
占用内存:9028k(不稳定)
解法二:
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(stack1.isEmpty() && stack2.isEmpty()){
throw new RuntimeException("Queue is empty!");
}
if(stack2.isEmpty()){
while(!stack1.isEmpty()){
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
}
解法二相较解法一来说,少了“将所有元素放入一个栈,再进行新元素操作”的过程。
存元素 直接存在1号栈中
取元素 从2号栈中取,如果2号栈没有元素,将1号栈的元素全部转移到2号栈
因为每个元素在被取之前,其与其之前被取得元素都会经历一次从1号栈到2号栈的转移,因此符合FIFO
要注意考虑调用pop()方法时,两个栈中皆无元素的情况
运行时间:9ms
占用内存:9464k