思路:
用兩個棧來實現(xiàn),棧sData存放入棧元素,棧sMin存放最小值。
按照元素入棧順序,將要入棧的第一個元素,同時壓入兩個棧中。后續(xù)每個元素入棧時,與sMin棧中棧頂元素比較大小,若入棧元素data 小于sMin棧頂元素,則把data同時壓入兩個棧中,若data大于sMin棧中棧頂元素,則只壓入棧sData中。出棧時,判斷兩個棧頂元素是否相等,若相等則兩個棧同時執(zhí)行出棧操作,不相等則,只有棧sData執(zhí)行出棧操作。
如:先入棧序列依次為 5 3 2 4 6 1 3
①.

②.

③.

④.

出棧的話如果相等就同時出棧,否則只出棧sData中的元素
代碼如下:
#include <iostream>#include <stack>using namespace std;template <class T>class MinStack{public: // 入棧 void push(const T& data) { // 第一個元素同時壓入兩個棧 if (sData.empty()) { sData.push(data); sMin.push(data); } else { if (data < sMin.top()) { sData.push(data); sMin.push(data); } else { sData.push(data); } } } void pop() { // 棧頂元素相等同時出棧 if (sMin.top() == sData.top()) { sData.pop(); sMin.pop(); } else { sData.pop(); } } T min() { return sMin.top(); }PRivate: stack<T> sData; stack<T> sMin;};int main(){ MinStack<int> s; s.push(5); s.push(3); s.push(2); s.push(4); s.push(6); s.push(3); s.push(1); cout << s.min() << endl; s.pop(); cout << s.min() << endl; s.pop(); cout << s.min() << endl; s.pop(); cout << s.min() << endl; s.pop(); cout << s.min() << endl; s.pop(); cout << s.min() << endl; s.pop(); return 0;}打印結(jié)果:
122223
新聞熱點
疑難解答