设计含最小函数min()的栈,要求min、push、pop、的时间复杂度都是O(1)。min方法的做用是:就能返回是栈中的最小值。【微信面试题】java
普通思路:
通常状况下,咱们可能会这么想:利用min变量,每次添加元素时,都和min元素做比较,这样的话,就能保证min存放的是最小值。可是这样的话,会存在一个问题:若是最小的元素出栈了,那怎么知道剩下的元素中哪一个是最小的元素呢?面试
改进思路:
这里须要加一个辅助栈,用空间换取时间。辅助栈中,栈顶永远保存着当前栈中最小的数值。具体是这样的:原栈中,每次添加一个新元素时,就和辅助栈的栈顶元素相比较,若是新元素小,就把新元素的值放到辅助栈中,若是新元素大,就把辅助栈的栈顶元素再copy一遍放到辅助栈的栈顶数组
package study; import java.util.Stack; public class MinStack { private Stack<Integer> stack = new Stack<Integer>(); private Stack<Integer> minStack = new Stack<Integer>(); //辅助栈:栈顶永远保存stack中当前的最小的元素 public void push(int data) { stack.push(data); //直接往栈中添加数据 //在辅助栈中须要作判断 if (minStack.size() == 0 || data < minStack.peek()) { minStack.push(data); } else { minStack.add(minStack.peek()); //【核心代码】peek方法返回的是栈顶的元素 } } public int pop() throws Exception { if (stack.size() == 0) { throw new Exception("栈中为空"); } int data = stack.pop(); minStack.pop(); //核心代码 return data; } public int min() throws Exception { if (minStack.size() == 0) { throw new Exception("栈中空了"); } return minStack.peek(); } public static void main(String[] args) throws Exception { MinStack stack = new MinStack(); stack.push(4); stack.push(3); stack.push(5); System.out.println(stack.min()); } }
已知一组数据一、二、三、四、5依次进栈,那么它的出栈方式有不少种,请判断一下给出的出栈方式是不是正确的?微信
例如:
数据:
一、二、三、四、5
出栈1:
五、四、三、二、1(正确)
出栈2:
四、五、三、二、1(正确)
出栈3:
四、三、五、一、2(错误)函数
一个数据进栈,它可能立刻出栈,也可能一下子再出栈。设计
package study; import java.util.Stack; //方法:data1数组的顺序表示入栈的顺序。如今判断data2的这种出栈顺序是否正确 public class StackTest { public static boolean sequenseIsPop(int[] data1, int[] data2) { Stack<Integer> stack = new Stack<Integer>(); //这里须要用到辅助栈 for (int i = 0, j = 0; i < data1.length; i++) { stack.push(data1[i]); while (stack.size() > 0 && stack.peek() == data2[j]) { stack.pop(); j++; } } return stack.size() == 0; } public static void main(String[] args) { Stack<Integer> stack = new Stack<Integer>(); int[] data1 = {1, 2, 3, 4, 5}; int[] data2 = {4, 5, 3, 2, 1}; int[] data3 = {4, 5, 2, 3, 1}; System.out.println(sequenseIsPop(data1, data2)); System.out.println(sequenseIsPop(data1, data3)); } }