1. 程式人生 > >演算法與資料機構學習_第一章.棧和佇列_1.設計一個有返回棧中最小元素功能的棧

演算法與資料機構學習_第一章.棧和佇列_1.設計一個有返回棧中最小元素功能的棧

設計一個有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(); } }