實現一個棧Stack,要求實現Push(出棧)、Pop(入棧)、Min(返回最小值的操作)的時間複雜度為O(1)
阿新 • • 發佈:2019-02-11
這裡的要求呢,跟我們平時的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中的棧頂,始終儲存棧中的最小值,這樣就可以實現功能。