题目
定义栈的数据结构,要求添加一个 min函数,能够得到栈的最小元素。
要求函数 min、push 以及 pop 的时间复杂度都是 O(1)。
要求函数 min、push 以及 pop 的时间复杂度都是 O(1)。
分析
栈是LIFO的队列,当一个新元素入栈时,栈的最小值状态是已经确定的,这时只需比较新元素与最小值的大小,并将新的最小值记录在该元素上。
显然,只用在标准的栈实现上,为每个元素加入一个伴随值min。
代码
class StackWithMin
{
public:
StackWithMin()
{
m_nTop = 0;
}
void Push(int dat)
{
if (m_nTop == 100) error("out of stack space");
m_aElements[m_nTop].value = dat;
m_aElements[m_nTop].min = dat;
if (m_nTop > 0 && m_aElements[m_nTop-1].min < dat)
m_aElements[m_nTop].min = dat;
m_nTop ++;
}
int Pop()
{
if (m_nTop == 0) error("empty stack");
int dat = m_aElements[m_nTop-1].value;
m_nTop --;
return dat;
}
int min()
{
if (m_nTop == 0) error("empty stack");
return m_aElements[m_nTop-1];
}
private:
struct Element
{
int value;
int min;
};
Element m_aElements[100]; // 简单实现, 使用了定长数组
int m_nTop;
};