定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素,push和pop的时间复杂度都是O(1),请简要叙述你的思想。
class StackEx { private int[] data; private int[] min; private int pos; private int len; public StackEx() { this(10); } public StackEx(int n) { pos = 0; len = n; data = new int[n]; min = new int[n]; } boolean push(int value) {//入栈操作的时候如果考虑完全应该进行扩容,在这里只是提供一个思路。 if (pos < len) { if (pos == 0) { min[pos] = value; } else { if (value < min[pos - 1]) { min[pos] = value; } else { min[pos] = min[pos - 1]; } } data[pos] = value; pos++; return true; } return false; } int pop() { return data[--pos]; } int min() { return min[pos - 1]; } } public class NowCoderMinStack { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int[] a = { 1, 3, 0, 19, 23, 29, 41, 2, 35, 9, 10 }; StackEx stack = new StackEx(a.length); for (int i = 0; i < a.length; i++) { stack.push(a[i]); } stack.pop(); System.out.println(stack.min()); } }
第二种思路 是利用辅助栈 ,声明一个栈用来存放元素的实例,声明一个栈用来存放与之对应位置上的最小元素的值,这样不用考虑扩容的情况。代码如下: import java.util.Stack; public class NowCoderMinStackSolution { private Stack<Integer> minStack = new Stack<Integer>(); private Stack<Integer> dataStack = new Stack<Integer>(); public void push(int node) { dataStack.push(node); if (minStack.isEmpty()) { minStack.push(node); } else { if (node <= min()) { minStack.push(node); } else { minStack.push(min()); } } } public void pop() { if (dataStack.isEmpty()) { return; } dataStack.pop(); minStack.pop(); } public int top() { if (!empty()) { dataStack.peek(); } return (Integer) null; } private boolean empty() { return dataStack.isEmpty(); } public int min() { return minStack.peek(); } public static void main(String[] args) { // TODO Auto-generated method stub int[] a = { 3, 1, 2, 5, 3, 9, -1, -2, 5, 9, 11 }; NowCoderMinStackSolution stack = new NowCoderMinStackSolution(); for (int i = 0; i < a.length; i++) { stack.push(a[i]); } stack.pop(); System.out.println(stack.min()); } }