zoukankan      html  css  js  c++  java
  • 包含min函数的栈

    题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。

    思路:

    定义两个栈,一个栈data用来正常压入、弹出数据,另一个栈min,压入的时候压入当前最小的数,弹出的时候也弹出最小的数

    当压入栈的时候,如果压入的数据小于当前栈中最小的数(记为premin),则压入该value,否则在压入一次先前最小的数(premin),这样min栈中的顶端永远是最小的数,min函数中直接return即可。而弹出栈的时候讲两个栈全部弹出即可。

    实现代码:

    下面定义的mystack类为 包含min函数的栈 的具体实现类

    #include<iostream>
    #include <stack> 
    #include <assert.h>
    using namespace std;
    template <typename T>
    class mystack
    {
    public:
        //mystack();
        void mypush(const T& value);
        void mypop();
        const T& mymin();
    private:
        stack<T> data,min;//data栈用来正常存储每一个进栈的数据,min栈进栈时用来存储当前最小的数据
    };
    //push函数的实现,data栈正常进数据,min栈进入当前栈中最小的数据
    template <typename T>
    void mystack<T>::mypush(const T& value)
    {
        data.push(value);
        //如果min栈中没有数据或者value小于当前栈的最小数据(top),则value进入min栈
        if(min.size()==0 || value<min.top())
            min.push(value);
        //否则min栈中进入的还是原来栈的最小数据(top)
        else
            min.push(min.top());
    }
    //pop函数的实现,data,min栈正常弹出数据
    template <typename T>
    void mystack<T>::mypop()
    {
        if(data.size()>0 && min.size()>0)
        {
            data.pop();
            min.pop();
        }
        else
        {
            cout<<"栈为空不能弹出数据!"<<endl;
        }
    }
    //min函数的实现,获得当前栈中的最小数据
    template <typename T>
    const T& mystack<T>::mymin()
    {
        //判断条件,如果值为假则打印错误信息并终止程序
        assert(data.size()>0 && min.size()>0);
        return min.top();
    }

    测试代码以及运行结果:

    int main()
    {
        mystack<int> s;
        s.mypush(3);
        s.mypush(4);
        s.mypush(2);
        s.mypush(1);
        s.mypop();
        s.mypop();
        cout<<"此时栈中最小的元素为:"<<s.mymin()<<endl;
        return 0;
    }

  • 相关阅读:
    数据处理
    Linux常用命令
    三大特征--多态
    封装设计思想--继承
    容器:列表、元组、字典
    封装
    python面向对象,类和对象
    python参数
    js中if条件语句以及switch条件语句的使用
    js中class类的基本理解及相关知识(一)
  • 原文地址:https://www.cnblogs.com/runninglzw/p/4569986.html
Copyright © 2011-2022 走看看