設計含最小函數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)); } }