實現乙個在O 1 內提供min操作的棧

2021-06-18 07:15:34 字數 2517 閱讀 7194

題目:

正如本文題目所示,要求實現乙個除了push,pop之外,還提供乙個在o(1)時間內給出堆疊內最小的數值的操作。

解析1:

對於這個問題,我們可以從堆疊節點儲存的資訊入手。通常堆疊的節點只儲存乙個資料物件,為了能夠在o(1)的時間內找到堆疊內最小的值,我們可以在每個堆疊節點內儲存乙個min值,用於指示堆疊在該節點及其以下的所有節點中,最小的值。這樣,當需要獲取堆疊中目前的最小值的時候,我們只需要獲取棧頂節點的min資料即可。

根據這種思想,我們不難寫出**:

#include #include using namespace std;

class outofdataexception

;//class outofdataexception

outofdataexception::outofdataexception(const string& msg)

:_msg(msg) {}

string outofdataexception::message() const

//class stackwithmin

;//node

node* _top;

int _size;

};//class stackwithmin

typedef stackwithmin stw;

stw::node* stw::node::clone() const

return p;

}//stw::node::copy

stw::stackwithmin():_top(null), _size(0) {}

stw::stackwithmin(const stackwithmin& rhs)

:_top(null), _size(rhs._size)

//stw::stackwithmin

stw::~stackwithmin()

//stw::~stackwithmin

stackwithmin& stw::operator=(const stackwithmin& rhs)

//stw::operator=

void stw::push(int data)

else

_top = p;

_size++;

}//stw::push

int stw::pop()

//stw::pop

int stw::min() const

//stw::min

void stw::destroy()

}//stw::destroy

bool stw::isempty() const

//stw::isempty

int main()

while(!s.isempty())

getchar();

}

解析2:

用上面的方法能夠正確的提供題目所要求的方法,但是這種方法所需的空間複雜度為o(n),n為堆疊元素個數。我們其實可以做到更好,使空間複雜度在最好的情況下降為o(1),最壞的情況下為o(n).這種方法中,我們並不直接修改堆疊節點型別,而是用另外乙個堆疊來儲存最小值的資訊。其中,儲存最小值的輔助棧的節點資訊中儲存當前棧的最小值,以及棧中包含最小值的節點的個數。

每次入棧時,有三種情況:

1.當入棧元素值小於當前堆疊的最小元素時,才將該值以及計數值(為1)同時放入輔助棧;

2.當入棧值大於棧的最小值時,存放最小值的棧不需要做任何改變;

3.當入棧值等於當前棧的最小值時,將最小值棧棧頂節點的最小值計數加一。

每次出棧時同樣包含兩種情況:

1.當出棧元素值大於當前棧的最小值,只需將其從棧中彈出即可,無需對輔助棧進行任何改變;

2.當出棧元素值等於當前棧的最小值,則將輔助棧棧頂節點中的計數資訊減一,當計數為零時,彈出棧頂元素;

每次要獲取棧中最小元素值,只需要獲取輔助棧棧頂元素的值即可。

根據這種思路,則不難給出**:

#include #include using namespace std;

class stackwithmin

;//class stackwithmin

typedef stackwithmin stw;

stw::stackwithmin():_size(0) {}

stw::~stackwithmin() {}

void stw::push(int data)

else if(data == minstack.top().first)

}//stw::push

int stw::pop()

return top;

}//stw::pop

int stw::size() const

//stw::size

int stw::isempty() const

//stw::isempty

實現乙個 O 1 查詢的 LRU Cache

簡單來說 lru 是記憶體管理的一種演算法,淘汰最近不用的頁。o 1 時間完成查詢,那除了 hash 別無選擇。lru 用雙向鍊錶實現即可。資料結構選擇好了,查詢我們用 hash 通過 key 得到鍊錶節點的位置,然後更新 lru 鍊錶即可。簡單說下自己的專案,乙個類似 memcache 的小型資料...

高階篇 設計乙個O(1)的資源池

設計乙個資源池,以下三個操作滿足o 1 複雜度 1 從未分配的資源中分配一塊資源 2 從已分配的資源中釋放指定資源 3 隨機訪問一塊已分配的資源。大致意思是這樣。class resourcepool def init self,cap self.rc i 1 for i in range cap s...

設計乙個佇列能夠在O 1 取得佇列的最大值

問題 設計乙個佇列能夠在o 1 時間內取得佇列的最大值 include include include o 1 的速度取出棧中的最大值 templateclass maxstack else if value max element top 返回棧頂元素 t top 出棧 void pop data...