您的位置:首页 > 编程语言 > C语言/C++

设计一个有getMin功能的栈(C++版)

2018-03-07 21:40 351 查看
题目:实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
要求:pop、push、getMin操作的时间复杂度都是O(1)
这个题我们有两种解决办法,如下:
1.使用两个栈,一个栈用来保存当前的元素,记做:stackData,一个栈用来保存压入操作每一步的最小元素,记做:stackMin。
入栈:当stackData栈中压入一个数据时,判断satckMin中是否为空。若为空,将该元素压入stackMin栈中。若不空,判断两者之间的大小,当前者小于或等于后者时,将前者中的数据压入后者中;当前者大于后者时,则将stackMin栈顶的元素再压入该栈中。
出栈:两个栈的栈顶元素同时弹出。
代码实现:class Stack
{
public:
void Push(int data)
{
stackData.push(data);
if (stackMin.empty())
{
stackMin.push(data);
}
else
{
int a = stackMin.top();
int b = data > b ? a : data;
stackMin.push(b);
}
}
void Pop()
{
assert(!stackData.empty() && !stackMin.empty());
stackData.pop();
stackMin.pop();
}
int getMin()
{
assert(!stackMin.empty());
stackMin.top();
}
private:
stack<int> stackData;
stack<int> stackMin;
};这种实现方式有一个问题,就是占用内存空间太大,栈内进行了多次重复操作,所以我们还有下面的一种实现方法。
2.同样使用两个栈,一个栈用来保存当前的元素,记做:stackData,一个栈用来保存压入操作每一步的最小元素,记做:stackMin。

入栈:入栈操作与上述情况有相同之处,唯一的不同就是当satckMin栈中的元素小于satckData中的元素时不进行任何操作。
出栈:要保证stackMin中栈顶的元素是sattckData中最小的,这个原则,其他与上一种思路保持不变。
代码实现如下:class Stack
{
public:
void Push(int data)
{
stackData.push(data);
if (stackMin.empty())
{
stackMin.push(data);
}
else
{
if (stackData.top()< stackMin.top())
{
stackMin.push(data);
}
}
}
void Pop()
{
assert(!stackData.empty() && !stackMin.empty());
if (stackData.top() == stackMin.top())
{
stackMin.pop();
}
else
stackData.pop();
}
int getMin()
{
assert(!stackMin.empty());
stackMin.top();
}
private:
stack<int> stackData;
stack<int> stackMin;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: