1. 程式人生 > >棧表中獲取最小值,時間複雜度為O(1)

棧表中獲取最小值,時間複雜度為O(1)

       近期複習資料結構,看到網上有一道演算法題,該題目曾經是google的一道面試題,國內的網際網路公司也紛紛效仿。我也順便複習之。

       題目內容為:對現在的stack(棧)資料結構進行改進,加一個min()功能,使之能在常數,即o(1),時間內給出棧中的最小值。可對push()和pop()函式進行修改,但要求其時間複雜度都只能是o(1)。

        解題思路:1.由於題目要求的是一個棧,所以想要通過棧內元素進行排序,這個是不可行的。

          2.由於存在每次的push和pop操作。所以,通過在入口設定最小值,然後不斷更新最小值的方式也是不可取的。因為,pop一次之後就失效了。

                    解決方案是通過輔助棧表,由於題目只要求獲得棧內剩餘元素中的最小值,並沒有要求每次pop出來的是最小值,我自己就陷入了這個思維。所以我們可以通過輔助棧,即資料棧每push一次,輔助棧也push一次,push的值為資料棧中的當前最小值。經過如此,最後,輔助棧每次push就均可獲得資料棧中的最小值。

         下面提供相關的示例程式碼:

   

//
//  main.cpp
//  棧最小值
//
//

#include <iostream>
#include <assert.h>
#include <deque>
using namespace std;

#define MAX_SIZE 100
template<typename T>//考慮到資料的多樣性,採用模版
class DataStack {
    T dataList[MAX_SIZE];
    T minList[MAX_SIZE];
    int top;//棧頂標記
    
public:
    DataStack(){top = -1;}
    void Push(T &value);
    T Pop();
    T GetMin();
};

template<typename T>
void DataStack<T>::Push(T &value){
    top++;
    dataList[top] = value;
    if (top == 0) {
        minList[top] = value;
    }
    else{
        if (value < minList[top-1]) {
            minList[top] = value;
        }
        else{
            minList[top] = minList[top - 1];
        }
    }
};
template<typename T>
T DataStack<T>::Pop(){
    minList[top] = 0;
    return dataList[top--];
}
template <typename T>
T DataStack<T>::GetMin(){
    return minList[top];
}

int main(int argc, const char * argv[]) {
    // insert code here...
    DataStack<int> dataList;
    int temp=9;
    dataList.Push(temp);
    temp = 8;
    dataList.Push(temp);
    temp = 13;
    dataList.Push(temp);
    temp = 35;
    dataList.Push(temp);
    
    cout<<dataList.GetMin()<<endl;
    dataList.Pop();
    cout<<dataList.GetMin()<<endl;
    dataList.Pop();
    cout<<dataList.GetMin()<<endl;
    dataList.Pop();
    cout<<dataList.GetMin()<<endl;
    dataList.Pop();
      return 0;
}