包含min函数的栈---重写栈实现特定的功能

重写一下栈的结构,要求具备入栈、出栈、求最小元素,复杂度都是o(1),
解题思路是用一个辅助栈存储每一次入栈时候的最小元素,出栈的时候,如果出栈的元素恰好是最小元素,则把辅助栈的栈顶元素删除。

需要注意的是,模板类型,不能指定成具体的类型,还有就是辅助找存放的是最小元素在数据栈中的位置,且辅助栈的元素数目时刻与数据栈中的元素的数目相等。

java代码

package stackAndQuence;

import java.util.Stack;

import org.omg.CORBA.PRIVATE_MEMBER;

public class stactMin {

    public static class StackWithMin<T extends Comparable<T>> {
        private Stack<T> dataStack;
        private Stack<Integer> mindata; // 存储的是最小元素的位置

        // 构造函数
        public StackWithMin() {
            this.dataStack = new Stack<>();
            this.mindata = new Stack<>();
        }

        // 入栈
        public void push(T t) {
            if (t == null) {
                System.out.print("error");
                return;
            }
            if (dataStack.isEmpty()) {
                dataStack.push(t);
                mindata.push(0);
            } else {
                T tmp = dataStack.get(mindata.peek());
                dataStack.push(t);
                if (t.compareTo(tmp) < 0) {
                    mindata.push(dataStack.size() - 1);
                } else {
                    mindata.push(mindata.peek());
                }
            }
        }

        // 出栈,保证数据栈和最小元素位置栈保持大小相等
        public T pop() {
            if (dataStack.isEmpty()) {
                return null;
            } else {
                mindata.pop();
                return dataStack.pop();
            }
        }

        // 取最小元素
        public T min() {
            if (mindata.isEmpty()) {
                throw new RuntimeException("No element in stack.");
            } else {
                return dataStack.get(mindata.peek());
            }
        }

    }

    public static void main(String[] args) {
        StackWithMin<Integer> stack = new StackWithMin<>();
        stack.push(3);
        System.out.println(stack.min() == 3);
        stack.push(4);
        System.out.println(stack.min() == 3);
        stack.push(2);
        System.out.println(stack.min() == 2);
        stack.push(3);
        System.out.println(stack.min() == 2);
        stack.pop();
        System.out.println(stack.min() == 2);
        stack.pop();
        System.out.println(stack.min() == 3);
        stack.push(0);
        System.out.println(stack.min() == 0);
    }

}

你可能感兴趣的:(java,栈)