題目:
正如本文題目所示,要求實現乙個除了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...