题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
题目来源:剑指offer--用两个栈实现队列
审题及思路
- 关键字:栈、队列
- 栈的特点是先进后出,队列的特点是先进先出。
- 解题的关键就是如何利用先进后出做到先进先出。
- 准备两个栈,一个用来装数据,另一个用来倒数据。
- 装的时候:看看倒数据的栈有没有数在,有的话,先倒回装数据的栈中,没有的话,就放进装数据的栈中。
- 倒的时候:看看装数据的栈有没有数在,有的话,倒进倒数据的栈里,再倒出倒数据的最上面的数据;没有的话,看看倒数据的栈里有没有数据,如果没有则报空队列异常,有的话则倒出倒数据的最上面的数据。
代码
import java.util.Stack;
public class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
if (this.stack2.isEmpty()){
this.stack1.push(node);
}else {
while (!this.stack2.isEmpty()){
this.stack1.push(this.stack2.pop());
}
this.stack1.push(node);
}
}
public int pop() {
if (this.stack1.isEmpty()&&this.stack2.isEmpty()){
throw new RuntimeException("Queue is empty!");
}else if (this.stack1.isEmpty()&&!this.stack2.isEmpty()){
return this.stack2.pop();
}else{
while (!this.stack1.isEmpty()){
this.stack2.push(this.stack1.pop());
}
return this.stack2.pop();
}
}
}
这一类问题要考察的核心其实是元素进出栈、队列的规则。
注: 以上代码不一定是最优解,如果你有更好的想法,快去尝试吧!