剑指offer——面试题21:包含min函数的栈(泛型编程,一个巧妙的思维)
2015-08-12 22:20
513 查看
题目:定义栈的数据结构,请在该类型中实现一个能够得到该栈的最小元素的min函数,在该栈中
调用min,push以及pop的时间复杂度都是O(1)
思路:
这题要求时间复杂度为O(1),所以需要一个很巧妙的方法,在这道题中,需要在每次min时
得到一个最小值,并且是当前最小的。
所以可以维护一个辅助栈sta2.一个主要存数据的栈sta1
push时,sta1直接压入,而sta2,当压入的数据大于当前的最小时,将那个当前的sta2的栈顶元素
再压入一次
pop时 sta1和sta2都pop
求最小min时,就是sta2的栈顶元素
调用min,push以及pop的时间复杂度都是O(1)
思路:
这题要求时间复杂度为O(1),所以需要一个很巧妙的方法,在这道题中,需要在每次min时
得到一个最小值,并且是当前最小的。
所以可以维护一个辅助栈sta2.一个主要存数据的栈sta1
push时,sta1直接压入,而sta2,当压入的数据大于当前的最小时,将那个当前的sta2的栈顶元素
再压入一次
pop时 sta1和sta2都pop
求最小min时,就是sta2的栈顶元素
#include<iostream> #include<stack> using namespace std; template<typename T> class stack_min { public: stack<T> sta1; stack<T> sta2; void push(const T& a); void pop(); T min(); }; template<typename T> void stack_min<T>::push(const T& a) { sta1.push(a); if(sta2.size()==0||sta2.top()>a) sta2.push(a); else sta2.push(sta2.top()); } template<typename T> void stack_min<T>::pop() { if(sta1.empty()) return; sta1.pop(); sta2.pop(); } template<typename T> T stack_min<T>::min() { if(sta2.empty()) exit(100); return sta2.top(); } int main() { stack_min<int> stamin; stamin.push(1); stamin.push(3); stamin.pop(); stamin.push(4); stamin.pop(); stamin.pop(); cout<<stamin.min()<<endl; system("pause"); }
相关文章推荐
- Web前端面试中遇到的问题
- 黑马程序员----排序算法分析与总结
- 红杏: 为学者、程序员、外贸工作者打造的上网加速器,专治各种网站打不开和打开慢,而且,更棒的是,红杏按需生效,不影响普通网站的访问速度。 杏不杏?由你红杏: 为学者、程序员、外贸工作者打造的上网加速器
- Java笔试面试题006
- 目标文件、ELF文件的一点小总结 《程序员的自我修养》·笔记
- 黑马程序员------C和OC的差异
- 黑马程序员--java基础--IO流(一)
- 黑马程序员------OC中NSLog与printf的区别
- 黑马程序员------OC中类的声明和实现
- 程序员如何掌握新技术与时俱进
- 剑指offer——面试题20:顺时针打印矩阵
- 一个程序员如何做到结构上胸有成竹
- 黑马程序员——java复习总结——异常和包
- 面试题:字符串截取
- 黑马程序员----java基础之流程控制语句
- 【面试总结】百度知道后台开发实习生
- JAVA真实企业面试题
- 黑马程序员——面向对象(this关键字)-第11天
- 黑马程序员--java基础--集合(三)
- 只会编程的程序员没有前途