每日一算法题-最小索引栈

94 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情

一、题目

描述:
定义栈的数据结构,请在该类型中实现—个能够得到栈中所含最小元素的min函数,输入操作时保证pop、top和min函数操作时,栈中一定有元素。
此栈包含的方法有:
push(value):将value压入栈中
pop():弹出栈顶元素
top():获取栈顶元素
min():获取栈中最小元素

image.png

#include <iostream>
#include <stack>
using namespace std;

class QyStack {
public:
    void push(int value) {

    }
    void pop() {

    }
    int top() {

    }
    int min() {

    }

    int exec(string action){
        return -1;
    }
};

int main(int, char*[])
{
    QyStack qys;
    qys.exec("PSH-1");
    qys.exec("PSH2");
    cout << "expect:  -1 2 1 -1" << endl;
    cout << "reality: ";
    cout << qys.exec("MIN") << ' ';
    cout << qys.exec("TOP") << ' ';
    qys.exec("POP");
    qys.exec("PSH1");
    cout << qys.exec("TOP") << ' ';
    cout << qys.exec("MIN") << endl;
}

二、分析

首先是对命令的解析,通过首字母可以分辨出TOP和MIN,通过第二个字母可以分辨POP和PSH。
其次,由题意可知,除了传统的栈操作之外,我们还得实现min函数。
想要获取最小值最容易想到是去排序,但由于是栈结构,所以不能改变元素的顺序。
如果想兼而得之,那我们只能采用双重结构来保存数据,这样一个用来保存栈顺序,一个用来保存最小值顺序。

三、模拟

  1. PSH-1
    正常栈:-1
    最小栈:-1
  2. PSH2
    正常栈:-1 2
    最小栈:-1 -1
  3. POP
    正常栈:-1
    最小栈:-1
  4. PSH1
    正常栈:-1 1
    最小栈:-1 -1

四、实现

class QyStack {
public:
    stack<int> data;
    stack<int> mini;
    void push(int value) {
        data.push(value);
        if(mini.empty() || value < mini.top()){
            mini.push(value);
        }else{
            mini.push(mini.top());
        }
    }
    void pop() {
        data.pop();
        mini.pop();
    }
    int top() {
        return data.top();
    }
    int min() {
        return mini.top();
    }

    int exec(string action){
        switch (action.at(0)) {
        case 'P':{
            if(action.at(1) == 'S'){
                push(atoi(action.substr(3).data()));
            }else{
                pop();
            }
        }break;
        case 'T': return top();
        default: return min();
        }
        return -1;
    }
};

五、结言

只要能想到用最小栈来应付MIN函数,这道题就已经非常简单了,主要还是思维的活跃性。

创作不易,留个赞再走吧!如果对文章内容有任何指正,欢迎评论!