(一)設計包含min函數的棧

來源:互聯網
上載者:User

題目:定義棧的資料結構,要求添加一個min函數,能夠得到棧的最小元素。要求函數min、push以及pop的時間複雜度都是O(1)。

 

分析:普通的棧push(),pop()都是O(1),現在需要加入min方法。第一眼看這個題,想到在棧結構中加一個min變數,儲存當前棧最小元素。這樣在push()操作時比較當時元素與min變數值來決定是否要替換min變數,即push()操作O(1),但是pop()的時候最有麻煩,因為如果pop()的是最小元素,那更新min變數就需要重新遍曆整個棧,時間複雜為O(n)。如果繼續按上面思路想下去,再加一個次小變數仍然解決不了pop()時更新的問題。所以需要定義一個輔助棧存當前棧中的最小值,也就是需要一個是正常的資料棧,一個是存放最小元素的輔助棧。push的時候,如果輔助棧為空白,則直接把當前元素壓入輔助棧。否則比較當前元素值與輔助棧頂元素值(即之前最小值),取最小者壓入棧。pop的時候與資料棧同時。最後提一個最佳化的地方,輔助棧可以不儲存資料本身,而是只儲存資料在資料棧的索引,這樣可以減少記憶體使用量。下面的實現使用STL的stack,沒有辦法用迭代器訪問stack中間元素,所以輔助棧儲存資料本身而並非索引。

 

C++實現:

#include <iostream><br />#include <stack><br />using namespace std;</p><p>template <typename T><br />class minStack{<br /> public:<br /> void push(const T&);<br /> void pop();<br /> T& top();<br /> T& min();<br /> bool empty(){return s.empty();}<br /> int size(){return s.size();}<br /> private:<br /> stack<T> s;<br /> stack<T> minVal;<br />};</p><p>template <typename T><br />void minStack<T>::push(const T& x){<br /> s.push(x);<br /> if(minVal.size()==0){<br /> minVal.push(x);<br /> }else if(minVal.top()>=x){<br /> minVal.push(x);<br /> }else if(minVal.top()<x){<br /> minVal.push(minVal.top());<br /> }<br />}</p><p>template <typename T><br />void minStack<T>::pop(){<br /> if(s.size()!=0){<br /> s.pop();<br /> minVal.pop();<br /> }else{<br /> cout << "Error: stack empty!!" << endl;<br /> }<br />}</p><p>template <typename T><br />T& minStack<T>::top(){<br /> return s.top();<br />}</p><p>template <typename T><br />T& minStack<T>::min(){<br /> return minVal.top();<br />}</p><p>template <typename T><br />void printStack(minStack<T> m){<br /> if(!m.empty()){<br /> cout << "min:" << m.min()<<"/t("<<m.top();<br /> m.pop();<br /> while(!m.empty()){<br /> cout << ", " << m.top();<br /> m.pop();<br /> }<br /> cout << ")" << endl;<br /> }else{<br /> cout << "stack empty" << endl;<br /> }<br />}</p><p>int main()<br />{<br /> minStack<int> ms;</p><p> ms.push(4); cout << "push 4!/t"; printStack(ms);<br /> ms.push(3); cout << "push 3!/t"; printStack(ms);<br /> ms.push(2); cout << "push 2!/t"; printStack(ms);<br /> ms.push(1); cout << "push 1!/t"; printStack(ms);<br /> ms.push(5); cout << "push 5!/t"; printStack(ms);<br /> while(!ms.empty()){<br /> ms.pop();<br /> cout << "pop!/t";<br /> printStack(ms);<br /> }</p><p> return 0;<br />}<br />

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.