剑指offer5_用两个栈实现一个队列

题目描述

用两个栈来实现一个队列,完成队列的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;
    }
}
 

猜你喜欢

转载自blog.csdn.net/lilililililydia/article/details/87873006
今日推荐