包含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;
}

posted @ 2015-06-11 19:39  runninglzw  阅读(241)  评论(0编辑  收藏  举报