题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
解题思路中的几个要点:
1.队列先进先出,而栈先进后出。
2.两个栈的话,分别一进一出,可以得到队列的效果。
3.在出队列的时候,完成第二个栈的进栈和出栈,注意判断stack2的状态(如果stack2为空,则先把stack1中的所有元素都进栈,再出栈;如果stack2不为空,则直接出栈一个元素。不用每次都把stack1中的元素全搬进stack2再出栈。)
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();
}
}
小思:
这道题是由两个栈实现一个队列;我们可以思考一下由两个队列怎么实现一个栈的操作。
思路:
两个栈实现队列可以进进出出而反转,但两个队列都是先进先出,所以不能这样做。基本的思路是,保持一个队列为空,另一个队列存放元素的形式,当出栈的时候,将除了最后一个元素之外的所以元素都给对面的空队列,最后弹出末位元素,从而模拟出栈。
1.模拟栈的入栈操作:如果两个队列都为空,优先选择队列1添加元素,否则,哪个队列有元素,就在哪个队列尾部追加元素。
2.模拟栈的出栈操作:如果两个队列都为空,抛出异常;否则,模拟栈的出栈规则,后进先出,即将其中一个不为空的队列的前n-1个元素从当前队列删除,添加入另一个队列中,再把此队列剩余的最后一个元素删除。故模拟栈的出栈操作。
public class Main2 {
Queue<Integer> queue1 = new LinkedList<Integer>(); //Queue是接口,故不能直接实例化
Queue<Integer> queue2 = new LinkedList<Integer>();
//模拟栈压入数据
public void push(int item){
//如果queue1队列和queue2队列都为空,优先选择queue1队列添加元素
if(queue1.isEmpty() && queue2.isEmpty()){
queue1.add(item);
return;
}
//如果队列1为空,向队列2添加元素
if(queue1.isEmpty()){
queue2.add(item);
return;
}
//如果队列2为空,向队列1添加元素
if(queue2.isEmpty()){
queue1.add(item);
return;
}
}
//模拟栈出数据
public int pop(){
//如果两个队列都没有元素可以弹出异常
if(queue1.isEmpty() && queue2.isEmpty()){
try {
throw new Exception("栈为空!");
} catch (Exception e) {
e.printStackTrace();
}
}
//如果queue1为空,将queue2的前queue2.size()-1个元素弹出放入queue1队列,queue2的最后一个元素直接弹出
if(queue1.isEmpty()){
while(queue2.size() > 1){
queue1.add(queue2.poll());
}
return queue2.poll();
}
//如果queue2为空,将queue1的前queue1.size()-1个元素弹出放入queue2队列,queue1的最后一个元素直接弹出
if(queue2.isEmpty()){
if(queue1.size() > 1){
queue2.add(queue1.poll());
}
return queue1.poll();
}
return 0;
}
}