題目描述:
定義棧的數據結構,請在該類型中實現一個能夠得到棧中所含最小元素的min函數(時間複雜度應爲O(1))。
解題思路:
該題注意利用舉例的方法使抽象的問題具體化;題目中是可以在O(1)複雜度的情況下,獲取棧中所有元素的最小元素,所以不能對棧中的數據進行排序操作,而且排序操作破壞了棧先進後出,後進先出的特點;綜上考慮得開闢輔助空間。如果輔助空間僅保存當前棧中最小元素,那麼在數據棧進行彈棧操作後,不知道該元素是否是最小元素;所以得記錄壓入數據棧中每個棧長度對應的最小值,輔助棧與數據棧一樣長,輔助棧的第i個元素表示數據棧中第i個元素到棧底元素之間所有元素的最小元素。輔助棧的實現只需要在每次對數據棧進行push時,比較當前push的元素與輔助棧的棧頂元素的大小,在輔助棧中壓入較小的元素。
數據棧用m_data表示,輔助棧用m_min表示;assert表示不滿足其括號中的條件的時候中斷運行程序。
實現代碼:
#include <assert.h>
class Solution {
public:
stack<int> m_data,m_min;//m_data數據棧,m_min最小輔助棧
void push(int value) {
m_data.push(value);
if(m_min.size() == 0 || m_min.top() > value)
m_min.push(value);
else
m_min.push(m_min.top());
}
void pop() {
assert(m_data.size() > 0 && m_min.size() > 0);
m_data.pop();
m_min.pop();
}
int top() {
assert(m_data.size() > 0);
return m_data.top();
}
int min() {
assert(m_data.size() > 0 && m_min.size() > 0);
return m_min.top();
}
};