所有代码均通过G++编译器测试,仅为练手纪录。
//面试题21:包含min函数的栈
//题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。
// 在该栈中,调用min/push/pop的时间复杂度都是O(1)。
//面试题21:包含min函数的栈
//题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。
// 在该栈中,调用min/push/pop的时间复杂度都是O(1)。
template<typename T>
class CStackMin
{
public:
CStackMin(){}
~CStackMin()
{
Clear();
}
public:
void Push(const T& item)
{
m_stackValue.push(item);
if (m_stackMin.empty())
{
m_stackMin.push(item);
}
else
{
if(item <= m_stackMin.top())
{
m_stackMin.push(item);
}
}
}
void Pop()
{
if(m_stackMin.empty())
{
return;
}
if(m_stackValue.top() == m_stackMin.top())
{
m_stackMin.pop();
}
m_stackValue.pop();
}
T Min() const
{
if(m_stackMin.empty())
{
return T();
}
return m_stackMin.top();
}
private:
void Clear()
{
while (!m_stackValue.empty())
{
m_stackValue.pop();
}
while (!m_stackMin.empty())
{
m_stackMin.pop();
}
}
private:
stack<T> m_stackValue;
stack<T> m_stackMin;
};
void TestStackMin()
{
CStackMin<int> stack;
stack.Push(3);
LogInfo("Min:%d",stack.Min());
stack.Push(7);
LogInfo("Min:%d",stack.Min());
stack.Push(2);
LogInfo("Min:%d",stack.Min());
stack.Push(4);
LogInfo("Min:%d",stack.Min());
stack.Push(9);
LogInfo("Min:%d",stack.Min());
stack.Push(1);
LogInfo("Min:%d",stack.Min());
stack.Push(4);
LogInfo("Min:%d",stack.Min());
stack.Pop();
LogInfo("Min:%d",stack.Min());
stack.Pop();
LogInfo("Min:%d",stack.Min());
stack.Pop();
LogInfo("Min:%d",stack.Min());
stack.Pop();
LogInfo("Min:%d",stack.Min());
stack.Pop();
LogInfo("Min:%d",stack.Min());
stack.Pop();
LogInfo("Min:%d",stack.Min());
stack.Pop();
LogInfo("Min:%d",stack.Min());
stack.Pop();
LogInfo("Min:%d",stack.Min());
}
ZhaiPillary
2016-12-25