设计包含min函数的栈

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);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值