設計一個堆疊,函式min、push 以及pop 的時間複雜度都是O(1)
阿新 • • 發佈:2019-02-19
/** * 2.設計包含min 函式的棧。 * 定義棧的資料結構,要求新增一個min 函式,能夠得到棧的最小元素。 * 要求函式min、push 以及pop 的時間複雜度都是O(1)。 * * 經典的空間換取時間,這個是利用java語言的JDK的實現的 */ public class A02_1 { public static void main(String[] args){ StackA stack = new StackA(); stack.push(1); System.out.println(stack.min()); stack.push(3);stack.push(0); System.out.println(stack.size()); System.out.println(stack.min()); stack.pop(); System.out.println(stack.min()); } static class StackA extends Vector<Integer>{ private static final long serialVersionUID = -2638250013215651059L; //最小值的棧,用來儲存最小的值的下標 public Stack<Integer> minstack = new Stack<Integer>(); /** * 取的最小值 * */ public Integer min(){ //最小值的下標,得到這個最小值 return super.get(minstack.peek()); } public void push(Integer interger){ if(super.size() == 0){ minstack.push(0); }else{ if(interger.compareTo(min())<= 0){ //如果壓棧的這個值比最小值小 minstack.push(super.size()); }else{ //如果壓棧的這個值比最小值大,還是原來的最小值對應的那個座標 minstack.push(minstack.peek()); } } super.add(interger); } public Integer pop(){ if(0 == super.size()) throw new EmptyStackException(); Integer result = super.get(super.size()-1); super.remove(super.size() - 1); //與之相對應的最小值的出棧 minstack.pop(); return result; } } }
//第二種的方法,更加的清晰說明空間換取時間
public class A02_2 { public static void main(String[] args){ stack name = new stack(); name.push(5); System.out.println(name.min()); name.push(2);name.push(6);//5 2 6 System.out.println(name.min()); name.pop();//5 2 System.out.println(name.min()); name.push(1);name.push(1);name.push(0);//5 2 1 1 0 System.out.println(name.min()); name.pop();name.pop();//5 2 1 System.out.println(name.min()); name.pop();name.pop();//5 System.out.println(name.min()); } static class element{ //當前元素的內容 public int content; //其對用的最小值 public int minvalue; public element(int value){ content = value; } } static class stack{ private static final int MAX = 10; element[] array =new element[MAX]; int top = -1; public int pop(){ if(top < 0){ throw new Error("null array"); } int result = array[top].content; array[top] = null; top--; return result; } public void push(int value){ element temp = new element(value); if(top < 0){ temp.minvalue = value; }else{ if(value <= min()){ //壓棧元素小於最小的元素 temp.minvalue = value; }else{ temp.minvalue = min();// } } top++; array[top] = temp; } public int min(){ if(top < 0){ throw new Error("null array"); } return array[top].minvalue; } } }