Day01_剑指Offer

Day01_剑指Offer

坚持30天,看看成效。小目标

一天两道剑指Offer题,大家都有美好的未来。加油!!!

package com.sorrymaker.day2501;

import java.util.Stack;

/**
 *
 * 题目:用两个栈实现一个队列。
 *      队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,
 *      分别完成在队列尾部插入整数和在队列头部删除整数的功能。
 *      (若队列中没有元素,deleteHead 操作返回 -1 )
 * @Author nextGame
 * @Date 2021/8/12 22:47
 * @Version 1.0
 */
public class CQueue {

    //Stack 的实现是线程安全的,所以性能比LinkedList低。
    //LinkedList实现了Deque的接口
    //(顶级接口)Collection-->Queue-->Deque-->LinkedList(实现类)
    //所以这里不用Stack的话,用Deque的话,效率会更高,但不是线程安全的。

    //先定义两个栈 stack1 ,stack2. stack1支持插入,stack2为删除
    Stack<Integer> stack1;
    Stack<Integer> stack2;

    public CQueue() {
        //初始化
        stack1 = new Stack<>();
        stack2 = new Stack<>();
    }

    public void appendTail(int value) {
        stack1.push(value);
    }

    public int deleteHead() {
        //短路与, 第一个为真的时候,才会判断第二个是不是也为真,第一个不为真,直接跳过判断第二个条件,提高效率。
        //当第一个栈和第二个栈都为空,说明队列里面没有元素了,所以返回-1.
        if (stack1.isEmpty() && stack2.isEmpty()) {
            return -1;
            //当第二个栈(删除的栈)为空时候
        } else if (stack2.isEmpty()) {
            //循环语句判断第一个栈是否不为空,不为空就把第一个栈的所有元素,pop出去,然后push进第二个栈。
            while (!stack1.isEmpty()) {

                stack2.push(stack1.pop());
            }
        }
        //上面的判断语句都过完之后,最后把第二个栈的元素都pop出来。
        return stack2.pop();
    }
}

image

package com.sorrymaker.day2501;

import java.util.Stack;

/**
 * @Author nextGame
 * @Date 2021/8/12 23:24
 * @Version 1.0
 */
public class MinStack {

    //A栈是主栈,B栈是辅助栈,确保B栈是非严格降序的。

    //创建栈A,B
    Stack<Integer> A, B;
    public MinStack() {
        //初始化栈A、B
        A = new Stack<>();
        B = new Stack<>();
    }
    public void push(int x) {
        //栈A新加 x 。
        A.add(x);
        //当B为空,B也同步加,当B不为空,判断B栈里面的元素是否大于等于x,(这里等于是避免加入的值恰好是b栈最小值)
        if(B.empty() || B.peek() >= x) {
            //B栈新加 x元素
            B.add(x);
        }
    }
    public void pop() {
        //当A栈要pop元素出去,要同步B栈,假如A栈pop的元素恰好是B栈的栈顶(最小值),那B栈也同步pop出栈顶元素。
        if(A.pop().equals(B.peek())){
            B.pop();
        }
    }
    public int top() {
        //要得到top, 既A栈的栈顶, 直接调用A.peek(),返回A栈的栈顶。
        return A.peek();
    }
    public int min() {
        //由于B栈是非严格降序的,所以B栈里面已经是排好序的了,我们只需要获取B栈的栈顶,就是当前A栈的最小值。
        return B.peek();
    }
}

image

posted @ 2021-08-13 00:10  独眼龙  阅读(31)  评论(0)    收藏  举报