算法之最小栈求解

问题描述

设计一个支持 push ,pop ,top 操作,并能提供一个获取最小值的方法getMin() 。

  • push(x) —— 将元素 x 推入栈中。
  • pop() —— 删除栈顶的元素。
  • top() —— 获取栈顶元素。
  • getMin() —— 检索栈中的最小元素。

解题思路

在这里插入图片描述
创建一个类名为Stack,内部依赖两个栈结构(_stack 和_stageStack)。第一个用来存真实的数据;而第二个栈用来存储当前栈中的最小值。

根据题意 新建头文件Stack.hpp,内容如下:

#ifndef Stack_hpp
#define Stack_hpp

#include <stdio.h>
#include <stack>

using namespace std;
class Stack{
private:
    stack<int>* _stack;
    stack<int>* _stageMinStack;
    
public:
    Stack();
    ~Stack();
    void push(int);
    void pop();
    int top();
    int getMin();
    bool empty();
};

#endif /* Stack_hpp */

具体的方法实现,内容如下:


#include "Stack.hpp"

Stack::Stack(){
    _stack = new stack<int>();
    _stageMinStack = new stack<int>();
}

Stack::~Stack(){
    free(_stageMinStack);
    free(_stack);
}

void Stack::pop(){
    if(_stack->empty()){
        return;
    }
    int top = _stack->top();
    //这里是所有判断要出栈的值大于_stageMinStack 栈顶的值,是因为_stageMinStack是绝对递增的
    //_stageMinStack的绝对递增是由其入栈逻辑决定的
    if(top== _stageMinStack->top()){
        _stageMinStack->pop();
    }
    _stack->pop();
}

void Stack::push(int ele){
    if(_stageMinStack->empty()){
        _stageMinStack->push(ele);
        //避免出现一对多的现象
    }else if(ele <= _stageMinStack->top()){
        _stageMinStack->push(ele);
    }
    _stack->push(ele);
}


int Stack::top(){
    if(_stack->empty()) return -1;
    return _stack->top();
}

int Stack::getMin(){
    if(_stageMinStack->empty()) return -1;
    return _stageMinStack->top();
}

bool Stack::empty(){
    return _stack->empty();
}

测试代码
int main(int argc, const char * argv[]) {
    Stack _stack;
    _stack.push(8);
    _stack.push(7);
    _stack.push(9);
    _stack.push(1);
    
    while (!_stack.empty()) {
        cout << _stack.getMin() <<endl;
        _stack.pop();
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值