問題形貌
定義棧的數據結構,請在該範例中完成一個能夠獲得棧最小元素的min函數。
剖析
該問題請求完成一個帶有返回當前棧中最小元素功用的數據結構,起首會想到運用一個變量保留當前最小元素的下標,然則細緻一想,假如當前最小元素剛好在棧頂,此時實行pop操縱,那末最小元素會被彈出,新的最小元素又上哪兒找呢?比較暴力的要領是湧現這類狀況時,再遍歷一遍棧就能夠重新獲得最小元素的下標,然則這麼暴力操縱就沒意思了而且時候複雜度很好。
能夠運用雙棧來完成min功用,棧1通例保留元素,棧2保留此時此刻的棧中最小 元素,比如說有元素進棧1,假如該元素小於棧2的棧頂元素,申明新的最小元素就是該進棧元素,不然,最小元素照樣棧2的棧頂元素。
代碼完成
var stack1 = [];
var stack2 = [];
function push(node)
{
if(stack2.length === 0 && stack1.length === 0){
stack1.push(node);
stack2.push(node);
} else{
stack1.push(node);
var stack2Top = stack2[stack2.length-1];
if(node < stack2Top)
stack2.push(node)
else
stack2.push(stack2Top);
}
}
function pop()
{
stack2.pop();
return stack1.pop();
}
function top()
{
return stack1[stack1.length-1];
}
function min()
{
return stack2[stack2.length-1];
}