java栈——两个栈实现队列

先来说一个小问题:
如何用O(1)时间复杂度求栈中的最小元素
思路如下:
使用两个栈,一个用来存储数据,一个用来存储栈的最小元素,入栈时:如果当前入栈的元素比原来栈中的最小值还小,则把这个最小值保持到栈中,出栈时:如果当前出栈的元素恰好为当前栈中的最小值,保存最小值元素的栈顶元素也出栈,是的最小值是这个被出栈元素入栈之前的最小值。

/**
 * 找出栈中的最小元素
 */
class MyStack {
    Stack elem;
    Stack min;

    public MyStack() {
        elem = new Stack();
        min = new Stack();
    }

    public void push(int val) {
        elem.push(val);
        if(min.isEmpty()) {
            min.push(val);
        }else {
            if(val < min.peek()) {
                min.push(val);
            }
        }
    }

    public int pop() {
        int tmp = elem.peek();
        elem.pop();
        if(tmp == min.peek()) {
            min.pop();
        }
        return tmp;
    }

    public int min() {
        if(min.isEmpty()) {
            return Integer.MAX_VALUE;
        }else {
            return min.peek();
        }
    }

}

只要创建MyStack类的实例进行栈的相关操作就可以了,Stack类是数组实现的栈——顺序栈。

两个栈实现一个队列:

思路:栈是先进后出,而队列是先进先出,所以我们要用两个栈实现数据先入先出即可,具体过程是先实例化两个空栈s1,s2,然后把数据放入其中一个栈s1里面,再让栈s1中的栈顶元素一次出来到栈栈s2中,再一次得到栈s2的栈顶元素即可。

    /**
     * 实现入队
     * @param s1
     * @param val
     */
    public static void enterQueue(Stack s1,int val) {
        s1.push(val);
    }

    /**
     * 实现出队
     * @param s1
     * @param s2
     * @return
     */
    public static int popQueue(Stack s1,Stack s2) {
        //1.把s1的数据倒入到s2
        //2.得到s2的栈顶元素
        int num = -1;
        if(s2.isEmpty()) {
            while(!s1.isEmpty()) {
                //1.得到s1的元素
                //2.s2.push();
                num = s1.pop();
                s2.push(num);
            }
        }
        //把s1的数据全部倒入s2里面
        int num2 = -1;
        if(!s2.isEmpty()) {
            num2 = s2.pop();
        }else {
            System.out.println("! !");
        }
        return num2;
    }


    public static void main(String[] args) {
        Stack stack = new Stack();
        Stack stack1 = new Stack();
        enterQueue(stack,5);
        enterQueue(stack,9);
        enterQueue(stack,45);
        enterQueue(stack,85);
        System.out.println(popQueue(stack,stack1));
     }
5

Stack类是数组实现的栈——顺序栈。

两个队列实现一个栈

猜你喜欢

转载自blog.csdn.net/QQ2899349953/article/details/83248341