算法7:设计一个class,类似于stack, 但可以是O(1)时间内返回min()

26 篇文章 0 订阅

解题思路

类中存一个数据栈和一个辅助栈,向数据栈push的时候,判断当前值与辅助栈栈顶的值的大小,如果小则push到辅助栈,否则push辅助栈的栈顶数值到辅助栈;向数据栈pop时,同时pop辅助栈的值。获取当前数值最小值即辅助栈栈顶数据,时间复杂度为O(1)

MinStack类定义

#include <stack>

using namespace std;

class MinStack
{
public:
    MinStack();
    ~MinStack();
    //栈的push操作
    void Push(int value);
    //栈的pop操作
    int Pop();
    //获取最小值操作
    int Min();
    //判断栈是否为空
    bool IsEmpty();

private:
    stack<int> dataStack;
    stack<int> minStack;
};

MinStack类实现

#include "stdafx.h"
#include "MinStack.h"
#include <iostream>

using namespace std;

MinStack::MinStack()
{

}

MinStack::~MinStack()
{

}

void MinStack::Push(int data)
{
    dataStack.push(data);

    //向minStack push当前最小值
    if(minStack.empty() || data < minStack.top())
    {
        minStack.push(data);
    }
    else
    {
        minStack.push(minStack.top());
    }
}

int MinStack::Pop()
{
    if(IsEmpty())
    {
        cout<<"stack is empty,can't pop"<<endl;
        return -1;
    }

    //获取栈顶数据
    int data = dataStack.top();

    dataStack.pop();
    minStack.pop();

    return data;
}

bool MinStack::IsEmpty()
{
    if(dataStack.empty())
    {
        return true;
    }

    return false;
}

int MinStack::Min()
{
    if(minStack.empty())
    {
        cout<<"min stack is empty"<<endl;
        return -1;
    }

    return minStack.top();
}

测试代码

#include "stdafx.h"
#include "MinStack.h"
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    cout<<"please input minStack"<<endl;
    MinStack minStack;
    int data = 0;

    for(int i = 0; i < 8; i++)
    {
        cin>>data;
        minStack.Push(data);
        cout<<"min data is "<<minStack.Min()<<endl;
    }

    minStack.Pop();
    cout<<"after pop one data, the min data is "<<minStack.Min()<<endl;

    minStack.Pop();
    cout<<"after pop one data, the min data is "<<minStack.Min()<<endl;

    minStack.Pop();
    cout<<"after pop one data, the min data is "<<minStack.Min()<<endl;

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值