演算法與資料機構學習_第一章.棧和佇列_1.設計一個有返回棧中最小元素功能的棧
阿新 • • 發佈:2019-01-28
設計一個有getMin功能的棧(返回棧中的最小元素)
演算法要求:實現一個特殊的棧,在實現棧的基本功能的基礎上,新增能夠實現返回棧中最小元素的棧,要求演算法的時間複雜讀為O(1),即在常數時間內實現。
思路:在一個棧中在時間複雜讀度為O(1)返回棧中最小元素是不可能實現的額,因此藉助另一個棧,即用2個棧實現,一個棧和普通的棧一樣,存放元素,另一個專門用來存放棧中最小元素。
演算法過程:定義2個普通的Stack棧,一個用於普通操作棧,一個用來存放棧中的最小元素,即為stackMin,這個最小元素預設是棧中第一個元素,當新新增進來的元素小於於stackMin棧中的元素時,將這個元素新增進來,到最後stackMin棧中存放的就是棧中最小元素。
演算法的java程式碼實現如下:
public class Stack_GetMin {
public static void main(String[] args) {
MyStack stackMin = new MyStack();
stackMin.push(5);
stackMin.push(3);
stackMin.push(-9);
stackMin.push(6);
stackMin.push(9);
stackMin.push(7);
int minValue = stackMin.getMinValue();
System.out.println("存放原始資料"+stackMin);
System.out.println(minValue);
}
}
class MyStack extends Stack<Integer>{
Stack<Integer> stackMin = new Stack<>();
@Override
public Integer push(Integer item) {
if (stackMin.empty()) {
stackMin.push(item);
}
else if (item<=stackMin.peek()) {
stackMin.push(item);
}
return super.push(item);
}
@Override
public synchronized Integer pop() {
if (lastElement()==stackMin.peek()) {
stackMin.pop();
}
return super.pop();
}
public int getMinValue() {
System.out.println("存放最小元素"+stackMin);
return stackMin.peek();
}
}