1.题目
设计包含min函数的栈。
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。
2. 实现思想
以空间换取效率,在每个栈元素中增加一个变量,用以记录当前栈的最小值
3. 代码实现
// 栈的最大空间
#define MAX_STACK_SIZE 100
// 栈元素
typedef struct MinStackElement
{
int Value; // 栈元素的值
int MinValue; // 当前栈的最小值
}StackElement;
class CMinStack
{
private:
StackElement m_Elements[MAX_STACK_SIZE]; // 所有可承载的栈元素
int m_nCurrentSize; // 当前栈的大小
public:
CMinStack(void);
~CMinStack(void);
public:
// 返回此栈的最小值
// 成功时true,否则false
bool Min(int &minvalue);
// 加入一个新的元素
// 成功时返回true
bool Push(int data);
bool Pop(int &popData);
// 此栈是否为空
// 为空时返回true
bool IsEmpty();
};
CMinStack::CMinStack(void)
{
m_nCurrentSize = 0; // 将当前大小置0
}
CMinStack::~CMinStack(void)
{
}
// 返回此栈的最小值
// 成功时true,否则false
bool CMinStack::Min(int &minvalue)
{
if(IsEmpty())
return false;
minvalue = m_Elements[m_nCurrentSize-1].MinValue;
return true;
}
// 加入一个新的元素
// 成功时返回true
bool CMinStack::Push(int data)
{
// 此时栈已经满了
if(m_nCurrentSize >= MAX_STACK_SIZE)
return false;
StackElement ele;
ele.Value = data;
if(IsEmpty())
{
ele.MinValue = data;
}
else
{
if( m_Elements[m_nCurrentSize-1].MinValue > data)
ele.MinValue = data;
else
ele.MinValue = m_Elements[m_nCurrentSize-1].MinValue;
}
m_Elements[m_nCurrentSize] = ele;
m_nCurrentSize++;
return true;
}
bool CMinStack::Pop(int &popData)
{
if(IsEmpty())
return false;
m_nCurrentSize--;
popData = m_Elements[m_nCurrentSize].Value;
return true;
}
// 此栈是否为空
// 为空时返回true
bool CMinStack::IsEmpty()
{
return (m_nCurrentSize <= 0);
}
4. 测试
int _tmain(int argc, _TCHAR* argv[])
{
// 最小值栈测试
CMinStack stack;
stack.Push(5);
stack.Push(10);
stack.Push(4);
int minvalue = 0;
stack.Min(minvalue);
stack.Pop(minvalue);
stack.Min(minvalue);
stack.Push(25);
stack.Push(1);
stack.Push(4);
stack.Min(minvalue);
stack.Pop(minvalue);
stack.Pop(minvalue);
stack.Pop(minvalue);
stack.Min(minvalue);
}