您的位置:首页 > 其它

包含min函数的栈

2015-06-11 19:39 399 查看
题目:定义栈的数据结构,要求添加一个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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: