返回栈中最小的元素,要求时间复杂度为O(1)
思想: 以空间换时间,用两个栈
DataStack栈中存储数据元素
MinDataStack栈中存储最小的数据元素
1.当两个栈都为空时,第一个数据元素在两个栈中都进行入栈操作
2.再遇到元素时,先入DataStack栈
3.将该元素与MinDataStack栈的栈顶元素比较,若小于MinDataStack栈的栈顶元素,则把
思想: 以空间换时间,用两个栈
DataStack栈中存储数据元素
MinDataStack栈中存储最小的数据元素
1.当两个栈都为空时,第一个数据元素在两个栈中都进行入栈操作
2.再遇到元素时,先入DataStack栈
3.将该元素与MinDataStack栈的栈顶元素比较,若小于MinDataStack栈的栈顶元素,则把
该元素入MinDataStack栈,否则把MinDataStack栈的栈顶元素再入MinDataStack栈
#include<iostream>
#include<stack>
using namespace std;
template<class T>
class MinStack
{
public:
void Push(const T&x)
{
DataStack.push(x);
if (MinDataStack.empty())
{
MinDataStack.push(x);
}
else
{
if (x < MinDataStack.top())
{
MinDataStack.push(x);
}
else
{
MinDataStack.push(MinDataStack.top());
}
}
}
void Pop()
{
if (!DataStack.empty())
{
DataStack.pop();
MinDataStack.pop();
}
}
void GetTop()
{
if (!DataStack.empty() && !MinDataStack.empty())
{
cout << DataStack.top() << endl;
}
}
void MinValue()
{
if (!MinDataStack.empty())
{
cout<<MinDataStack.top()<<endl;
}
}
private:
stack<T> DataStack;
stack<T> MinDataStack;
};
int main()
{
MinStack<int> ss;
ss.Push(3);
ss.Push(2);
ss.Push(1);
ss.Pop();
ss.MinValue();
ss.Pop();
ss.Pop();
ss.MinValue();
system("pause");
return 0;
}