题目:
实现一个特殊的栈,可以提供返回最小值的操作。
要求:
1. push,pop和getMin时间复杂度都是O(1)
2. 设计的栈可以使用现成的栈结构
思路:
使用两个栈,一个做数据栈,一个做最值栈。
第一种方法:
不重复的保存最值
第二种方法:
重复的保存最值
代码:
#include <exception>
#include <stack>
using namespace std;
class MinStack1
{
private:
stack<int> stackData;
stack<int> stackMin;
public:
void push(int v)
{
if( stackMin.empty() )
stackMin.push(v);
else if( v <= stackMin.top() )
stackMin.push(v);
stackData.push(v);
}
void pop()
{
if( stackData.empty() )
return ;
if( stackData.top() == stackMin.top() )
stackMin.pop();
stackData.pop();
}
bool top(int& r)
{
if( stackData.empty() )
return false;
r = stackData.top();
return true;
}
bool getMin(int& r)
{
if( stackMin.empty() )
return false;
r = stackMin.top();
return true;
}
int size()
{
return stackData.size();
}
};
class MinStack2
{
private:
stack<int> stackData;
stack<int> stackMin;
public:
void push(int v)
{
if( stackMin.empty() )
stackMin.push(v);
else
{
int t = stackMin.top();
if( v <= t )
stackMin.push(v);
else
stackMin.push(t);
}
stackData.push(v);
}
void pop()
{
if( stackData.empty() )
return ;
stackData.pop();
stackMin.pop();
}
bool top(int& r)
{
if( stackData.empty() )
return false;
r = stackData.top();
return true;
}
bool getMin(int& r)
{
if( stackMin.empty() )
return false;
r = stackMin.top();
return true;
}
int size()
{
return stackData.size();
}
};