题目:实现一个特殊的栈,在实现栈基本功能的的基础上,再实现返回栈中的最小元素操作
要求:pop push getMin操作的时间复杂度都是O(1)
看到题目可以想到大体分为两种思路,一是通过一个栈来实现;二则是通过两个栈来实现
我先实现用一个栈的
用一个栈的话就要一次压入两个值,data值,和记录的最小值Min,
方法是:向一个stack中压入数据data,第一次由于栈是空的,所以第一次压入的Min就是data,此时保存栈顶数据top;然后再向其中压入第二个数据,如果第二个数据大于第一个,则压入data之后再次压入top,如果第二个数据小于第一个则和第一次压入时一样。
pop的时候是直接pop栈顶元素即可,但是要记得判空的条件
代码实现如下:
template <typename T>
class getStackMin
{
public:
getStackMin()
{}
void Push(const T&data)
{
if (s.empty()||data<s.top())
{
s.push(data);
s.push(data);
}
else
{
T minData = s.top();
s.push(data);
s.push(minData);
}
}
void pop()
{
assert(!s.empty());
s.top();
s.pop();
}
T& top()
{
T minData = s.top();
s.pop();
T& ret = s.top();
return ret;
}
当然我是先压入data在压入min的这样的话第一次出栈取的直接是最小值,比较方便
其实也可以定义一个结构体,里面存入两个数据,其它的操作与上面的类似
struct Elem
{
T minData;
T data;
};
第二种是用两个栈,我觉得这种更加方便
data栈值用来压入数据,而min栈用来记录最小值,第一次是将data放入min栈 然后再次压入data的时候与min的栈顶进行比较,若大于就在min栈中重复压入min的栈顶元素,否则压入data;最后的min的栈顶元素即为最小值
//#include<stack>
//#include<iostream>
//using namespace std;
//class solution
//{
// stack<int> StackData;
// stack<int>StackMin;
// void Push(int data)
// {
// StackData.push(data);
// if (StackMin.empty())
// {
// StackMin.push(data);
// }
// else
// {
// if (data<StackData.top())
// {
// StackMin.push(data);
// }
// else
// {
// StackMin.push(StackMin.top);
// }
// }
// }
// void Pop()
// {
// StackData.pop();
// StackMin.pop();
// }
// int top()
// {
// return StackData.top();
// }
// int MinData()
// {
// return StackData.top();
// }
//};