特殊栈(返回栈中最小值)时间复杂度o(1)

题目要求

实现一个特殊的栈,实现栈的基本功能基础上,在实现返回栈中最小元素的操作,并且复杂度为o(1)

实现思路

准备一个栈和一个辅助栈,压入第一个元素时同时向栈和辅助栈压入第一个元素,
之后每压一次栈都将该元素和辅助栈对应上一个元素比较,压栈元素大于辅助栈对应前一个元素,
就再次压入上一个元素到辅助栈,否则向辅助栈压入当前元素
这样辅助栈顶就是我们需要的最小元素

举个例子:  4 5 3 9 1 0
栈:        辅助栈
压入4       压入4
压入5       压入4(5和辅助栈上一个元素比较 5>4 压入辅助栈上一个元素)
压入3       压入3(3和辅助栈上一个元素比较 3<4 压入待压栈元素)
压入9       压入3(9和辅助栈上一个元素比较 9>3 压入辅助栈上一个元素)
压入1       压入1(1和辅助栈上一个元素比较 1<3 压入待压栈元素)
输出辅助栈最后一个元素1为最小值

代码

/**
 * @description:实现一个特殊的栈,实现栈的基本功能基础上,在实现返回栈中最小元素的操作,并且复杂度为o(1)
 * @Author MRyan
 * @Date 2020/5/16 17:09
 * @Version 1.0
 */
public class StackGetmin {
    //栈
    private static int[] nums;
    //辅助栈
    private static int[] help;
    private static int size;
    private static int helpsize;

    public static void main(String[] args) {
        //初始化
        init(6);
        //压栈
        push(4);
        push(5);
        push(3);
        push(9);
        push(2);
        //输出当前栈中最小值 2
        System.out.println("the min is:" + getmin());
        //弹出栈顶元素
        poll();
        //压栈
        push(1);
        //输出当前栈中最小值 1
        System.out.println("the min is:" + getmin());
        //当前栈的状态
        for (int i : nums) {
            System.out.print(i + " ");
        }
        System.out.println();
        //辅助栈的状态
        for (int i : help) {
            System.out.print(i + " ");
        }


    }

    /**
     * 获取最小值
     *
     * @return
     */
    public static int getmin() {
        //获取辅助栈栈顶元素即是最小值
        return help[helpsize];

    }

    /**
     * 初始化
     *
     * @param stacksize
     */
    public static void init(int stacksize) {
        if (stacksize < 0) {
            throw new IllegalArgumentException("the init size is less than 0");
        }
        nums = new int[stacksize];
        help = new int[stacksize];
        size = 0;
        helpsize = 0;
    }

    /**
     * 压栈
     *
     * @param num
     */
    public static void push(int num) {
        if (size > nums.length) {
            throw new IndexOutOfBoundsException("the stack size is full");
        }
        //压入第一个元素时 直接将第一个元素压栈并且压入辅助栈
        if (size == 0) {
            nums[0] = num;
            help[0] = num;
            //栈下标变为1 指向第二个元素
            size = 1;
        } else {
            //压栈
            nums[size++] = num;
            //如果压入值大于  就再次压入上一个元素到辅助栈
            if (num > help[helpsize]) {
                help[++helpsize] = help[helpsize - 1];
            }
            //否则压入待压栈元素到辅助栈
            else {
                help[++helpsize] = num;
            }
        }
    }

    /**
     * 获取栈顶元素
     *
     * @return
     */
    public static int peek() {
        if (size <= 0) {
            throw new IndexOutOfBoundsException("the stack size is empty");
        }
        return nums[size - 1];
    }

    /**
     * 弹出栈顶元素
     *
     * @return
     */
    public static int poll() {
        if (size <= 0) {
            throw new IndexOutOfBoundsException("the stack size is empty");
        }
        //弹出栈顶元素时 辅助栈也跟着弹出
        helpsize--;
        return nums[--size];

    }
}


猜你喜欢

转载自blog.csdn.net/qq_35416214/article/details/106767911