思路整理自劍指Offer
一:題目描述
定義棧的數據結構,請在該類型中實現一個能夠得到棧最小元素的min函數。
二:解題思路
剛看時讀題,並沒有很清楚的理解題目的意思,看了解析後才明白,題目的意思可簡單理解爲:
一批數據入棧後,你可以獲得這批數據的最小值,可以更改push(),pop(),top()函數和新建的min()函數實現
可以藉助輔助棧,利用空間換時間,實現時間複雜度爲O(1)的方法
以例子說明,加入將3,4,2,1壓棧,求棧中元素最小值
定義一個輔助棧,與原始棧同時出棧入棧,區別在於輔助棧每次都把最小值壓入棧,那麼就可以保證,輔助棧棧頂一直都是最小元素。
三:代碼實現
class Solution {
public:
//需要自己定義棧,以及輔助棧
stack<int> data; //存放數據
stack<int> min_data; //存放data中的最小值,min_data大小等於data大小
void push(int value) {
//新元素入棧
data.push(value);
//如果min_data爲空,新元素入棧
if(min_data.size()==0)
min_data.push(value);
//如果min_data不爲空否則,
else{
//value小於min_data棧頂元素,入棧,
if(value<=min_data.top())
min_data.push(value);
else{
//value小於min_data棧頂元素,說明當前min_data的棧頂元素是data中的最小值,再將min_data棧頂元素入棧
int topValue=min_data.top();
min_data.push(topValue);
}
}
}
//彈棧,獲得棧頂元素,獲得棧的最小值,都是對原始棧而言的
void pop() {
data.pop();
min_data.pop();
}
int top() {
return data.top();
}
int min() {
return min_data.top();
}
};