1. 程式人生 > >實現一個棧Stack,要求實現Push(出棧)、Pop(入棧)、Min(返回最小值的操作)的時間複雜度為O(1)

實現一個棧Stack,要求實現Push(出棧)、Pop(入棧)、Min(返回最小值的操作)的時間複雜度為O(1)

這裡的要求呢,跟我們平時的stack操作是一樣的,那什麼地方不同呢?多了一個min方法,並且要求時間複雜度為O(1),那該怎麼做呢?O(1)的意思就是說,要用了,直接就能拿到,就好比陣列直到下標一樣,直接取。
那麼如果能夠將一個棧的棧頂一直存放的都是最小值呢?那麼,我們的要求就實現了,藉助c++的封裝特性,我編寫了以下程式碼,以便實現功能。

#define _CRT_SECURE_NO_WARNINGS 10
#include<iostream>
#include<cstdlib>
#include<stack>
using namespace std
; template<class T> class MyStack { public: void Push(const T& x) { s1.push(x); if (s2.empty() || x <= s2.top()) s2.push(x); } void Pop() { if (!s1.empty()) { if(s2.top()<s1.top()) s1.pop(); else
{ s1.pop(); s2.pop(); } } } T min() { if (!s2.empty()) return s2.top(); } private: stack<T> s1; stack<T> s2; }; void Test1() { MyStack<int> mystack; mystack.Push(4); mystack.Push(3
); mystack.Push(2); mystack.Push(1); cout<<mystack.min()<<endl; mystack.Pop(); cout << mystack.min() << endl; mystack.Pop(); cout << mystack.min() << endl; mystack.Pop(); cout << mystack.min() << endl; mystack.Pop(); } int main() { Test1(); system("pause"); return 0; }

s2中的棧頂,始終儲存棧中的最小值,這樣就可以實現功能。