标签:
题目:定义栈的数据结构,要求添加一个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; }
标签:
原文地址:http://www.cnblogs.com/runninglzw/p/4569986.html