算法案例(2)----------實現一個具有getMin功能的棧

零、簡介

  • 記錄 左程雲 大神的  程序員代碼面試指南 一書裏面的算法實現。
  • 代碼路徑: https://github.com/1956025812/algorithm 
  • 2020年開始每週一道算法,成就自己的算法之路~

一、題目

  • 題目: 實現一個具有getMin功能的棧。
  • 要求: pop、push、getMin的時間複雜度都是o(1)。可以使用現有的棧結構。

二、實現思路

  • 內部定義另一個臨時棧,始終存放最小值即可。
  • push數據的時候,與臨時棧棧頂元素比較,如果小於或等於,則同步push到臨時棧的棧頂;
  • pop數據的時候,與臨時棧棧頂元素比較,如果一樣,則同步將臨時棧的數據pop出來;
  • getMin功能,臨時棧的棧頂元素始終都是最小值,一個pop操作的複雜度就是o(1);

三、案例

3.1 代碼

package day20200101;

import java.util.Stack;

/**
 * 題目:  設計一個有getMin功能的棧
 * 要求:
 * 1. pop、push、getMin的時間複雜度都是o(1)
 * 2. 設計的棧類型可以使用現成的棧結構
 * <p>
 * 思路:
 * 構造一個臨時的棧,用來存放最小的數據。
 * push數據的時候與臨時棧的棧頂元素做比較,如果小於或等於,就放到臨時棧。注意: 小於和等於都要放。
 * pop數據的時候與臨時棧的棧頂元素做比較,如果一樣,則同步pop
 */
public class MyMinStack {

    private Stack<Integer> dataStack;
    private Stack<Integer> tempStack;

    public MyMinStack() {
        this.dataStack = new Stack<>();
        this.tempStack = new Stack<>();
    }

    /**
     * push方法
     *
     * @param data 新數據
     */
    public void push(Integer data) {
        dataStack.push(data);

        if (tempStack.isEmpty()) {
            tempStack.push(data);
        } else {
            if (data <= tempStack.peek()) {
                tempStack.push(data);
            }
        }
    }


    /**
     * pop方法
     *
     * @return 棧頂元素
     */
    public Integer pop() {
        if (dataStack.isEmpty()) {
            throw new RuntimeException("當前棧dataStata沒有數據");
        }

        // 如果要pop的元素正好是最小元素,則要同時一起將臨時棧的元素pop
        Integer popData = dataStack.peek();
        if (popData.equals(tempStack.peek())) {
            tempStack.pop();
        }

        return dataStack.pop();
    }


    /**
     * getMin方法
     *
     * @return 棧的最小元素
     */
    public Integer getMin() {
        if (tempStack.isEmpty()) {
            throw new RuntimeException("當前棧dataStata沒有數據");
        }
        return tempStack.pop();
    }


    public static void main(String[] args) {
        MyMinStack myMinStack = new MyMinStack();
        myMinStack.push(3);
        myMinStack.push(2);
        myMinStack.push(3);
        myMinStack.push(6);
        myMinStack.push(1);
        System.out.println(myMinStack.getMin());
        myMinStack.pop();
        System.out.println(myMinStack.getMin());
    }
}



3.2 測試

1
2

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章