首页 > 其他分享 >实现一个特殊的栈,是它除了有基本的push()和pop()方法外,再实现一个返回栈中最小元素的方法getMin()。(有图)

实现一个特殊的栈,是它除了有基本的push()和pop()方法外,再实现一个返回栈中最小元素的方法getMin()。(有图)

时间:2022-11-03 00:12:55浏览次数:42  
标签:minStack 有图 pop public newNum getMin push Stack

package class03;

import java.util.Stack;

/**
 * 实现一个特殊的栈,是它除了有基本的push()和pop()方法外,再实现一个返回栈中最小元素的方法getMin().
 * (1)push()、pop()、getMin()方法的时间复杂度都是O(1)。
 * (2)设计的栈类型,可以使用现成的栈结构。
 */
public class Code05_GetMinStack {
    //自定义栈1
    public static class MyStack1 {
        private Stack<Integer> dataStack;//定义一个数据栈
        private Stack<Integer> minStack;//定义一个最小数存放的栈

        public MyStack1() {
            dataStack = new Stack<>();
            minStack = new Stack<>();
        }

        public void push(int newNum) {
            if (minStack.isEmpty()) {
                minStack.push(newNum);
            } else if (newNum <= getMin()) {//如果新添加的数,小于等于现在最小栈中的最小值,就把这个新数添加到最小栈中。
                minStack.push(newNum);
            }
            dataStack.push(newNum);//不管新数和现在的最小栈中的最小值,谁大。都需要把这个新数,添加到数据栈中。
        }

        public int pop() {
            if (dataStack.isEmpty()) {
                throw new RuntimeException("your stack is empty!");
            }
            Integer num = dataStack.pop();
            if (num == getMin()) {
                //如果数据栈中弹出的这个数num,等于最小栈中的最小值,
                //就在弹出数据栈中栈顶的元素时,把最小栈中的最小值也同时弹出。
                minStack.pop();
            }
            return num;
        }

        //获取自定义栈MyStack1的最小值
        public int getMin() {
            if (minStack.isEmpty()) {
                throw new RuntimeException("your stack is empty!");
            }
            return minStack.peek();
        }
    }

    //自定义栈2
    public static class MyStack2 {
        Stack<Integer> dataStack;//数据栈
        Stack<Integer> minStack;//最小栈

        public MyStack2() {
            dataStack = new Stack<>();
            minStack = new Stack<>();
        }

        public void push(int newNum) {
            if (minStack.isEmpty()) {
                minStack.push(newNum);
            } else if (newNum <= getMin()) {//如果新数<=最小值,就把新数push到最小栈中。
                minStack.push(newNum);
            } else {//如果新数,不小于等于最小值,就把最小栈中的最小值,push到最小栈中。(这个数就是用来占位的)
                minStack.push(getMin());
            }
            dataStack.push(newNum);//将新数push到数据栈中。
        }

        public int pop() {
            if (dataStack.isEmpty()) {
                throw new RuntimeException("your stack is empty!");
            }
            minStack.pop();//最小栈弹出一个数
            return dataStack.pop();//数据栈弹出一个数,并返回。
        }

        //获取自定义栈MyStack2的最小值
        public int getMin() {
            if (minStack.isEmpty()) {
                throw new RuntimeException("your stack is empty!");
            }
            return minStack.peek();
        }
    }

    public static void main(String[] args) {
        MyStack1 stack1 = new MyStack1();
        stack1.push(3);
        System.out.println(stack1.getMin());
        stack1.push(4);
        System.out.println(stack1.getMin());
        stack1.push(1);
        System.out.println(stack1.getMin());
        System.out.println(stack1.pop());
        System.out.println(stack1.getMin());

        System.out.println("=============");

        MyStack2 stack2 = new MyStack2();
        stack2.push(3);
        System.out.println(stack2.getMin());
        stack2.push(4);
        System.out.println(stack2.getMin());
        stack2.push(1);
        System.out.println(stack2.getMin());
        System.out.println(stack2.pop());
        System.out.println(stack2.getMin());
    }

}

 MyStack1

 

 

 

 MyStack2

 

标签:minStack,有图,pop,public,newNum,getMin,push,Stack
From: https://www.cnblogs.com/TheFloorIsNotTooHot/p/16853012.html

相关文章