包含min函数的栈
2015-06-11 19:39
399 查看
题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。
思路:
定义两个栈,一个栈data用来正常压入、弹出数据,另一个栈min,压入的时候压入当前最小的数,弹出的时候也弹出最小的数
当压入栈的时候,如果压入的数据小于当前栈中最小的数(记为premin),则压入该value,否则在压入一次先前最小的数(premin),这样min栈中的顶端永远是最小的数,min函数中直接return即可。而弹出栈的时候讲两个栈全部弹出即可。
实现代码:
下面定义的mystack类为 包含min函数的栈 的具体实现类
测试代码以及运行结果:
思路:
定义两个栈,一个栈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; }
相关文章推荐
- 在Spring3中使用注解(@Scheduled)创建计划任务
- RFC2889转发性能测试用例设计和自动化脚本实现
- java异常处理--用代码说话
- 深度注入:
- Android Java 程序员必备开发工具
- java final keyword
- MVC 常见数据验证速查手册
- 引入sun.misc.BASE64Encoder错误处理
- Please ensure that adb is correctly located at 问题解决方法
- 使用malloc在堆上创建二维数组
- HB在线打包ipa通过application loader上传出错
- SDNU 1015.最远路径【二叉树DFS】
- TIJ英文原版书籍阅读之旅——Chapter Seven:Reusing Classes
- 关于android模拟器emulator-5554 disconnected错误解决方法
- eclipce 关联 javadoc
- 新手了解.Nat
- 修改jsp默认编码为utf-8
- 自定义Sharepoint Server 2010人员选择功能-替换默认点击事件
- bzoj 1026 [SCOI2009]windy数 数位dp
- Java并发编程-02-线程的中断,休眠和等待线程的终止