實現一個棧,要求實現Push(出棧)、Pop(入棧)、Min(返回最小值的操作)的時間複雜度爲O(1)
在棧中操作的話,push和pop的時間複雜度就是O(1),所以我們只用實現Min(返回最小值的操作)的時間複雜度爲O(1),
思想就是用兩個棧,一個就是普通的存取數據的棧,另一個爲當前未知的最小值,插入數據和刪除數據兩個棧都進行操作,返回最小值的話,直接對第二個棧操作。
代碼如下:
#include <iostream>
using namespace std;
#include <stack>
template <class T>
class retmin
{
public :
void pushmin(const T& x)
{
_num.push (x);
if(!_min.empty ())
{
T tmp = _min.top ();
if( x < tmp)
{
_min.push (x);
}
else
_min.push (tmp);
}
else
_min.push (x);
}
void popmin()
{
_num.pop ();
_min.pop ();
}
T Retmin()
{
return _min.top ();
}
private :
stack<T> _num;
stack<T> _min;
};
void Test9()
{
retmin< int> r1;
r1.pushmin (5);
r1.pushmin (4);
r1.pushmin (3);
r1.pushmin (6);
r1.pushmin (0);
cout<<r1.Retmin ()<<endl;
}
int main()
{
Test9();
return 0;
}