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

来源:互联网 发布:xampp linux 编辑:程序博客网 时间:2024/06/07 01:04

重写一下栈的结构,要求具备入栈、出栈、求最小元素,复杂度都是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);    }}
0 0
原创粉丝点击