题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数,以及push,pop函数。要求三个函数的时间复杂度均为O(1)。
解题思路:
1.只设置一个变量保留最小的值是没有意义的,所以我自己一开始想到的是用Map:
class Solution {
public:
vector<int> stack;
map<int,int> dict;
int minnum;
bool bWrongFlag = 0; //全局错误标志
void push(int value) {
stack.push_back(value);
dict[value]++;
auto iter = dict.begin(); //由于map会自动排序,所以可以很快的得到最小数字
minnum = iter->first;
}
void pop() {
if(stack.empty())
{
bWrongFlag = 1;
return;
}
int tmp = stack.back();
stack.pop_back();
if(--dict[tmp]==0)
dict.erase(tmp); //弹出的时候,相应的map要进行元素的清理
minnum = (*dict.begin()).first; //重新更新最小元素
}
int top() {
if(stack.empty())
{
bWrongFlag = 1; //如果栈此时为空,那么top和min是没有意义的,所以要设置全局的错误标志
return 0;
}
return stack.front();
}
int min() {
if(stack.empty())
{
bWrongFlag = 1;
return 0;
}
return minnum;
}
};
2、第二种思路更为巧妙,使用一个额外的栈来存储最小元素,在每次push的时候也进行push:
class Solution {
public:
stack<int> s;
stack<int> minnum;
bool bWrongFlag = 0; //全局错误标志
void push(int value) {
s.push(value);
if(minnum.empty()||minnum.top()>value) //最小辅助栈同步进行压入
minnum.push(value);
else
minnum.push(minnum.top());
}
void pop() {
s.pop();
minnum.pop();
}
int top() {
if(s.empty())
{
bWrongFlag = 1;
return 0;
}
return s.top();
}
int min() {
if(minnum.empty())
{
bWrongFlag = 1;
return 0;
}
return minnum.top();
}
};