设计包含min函数的栈
2013-02-25 16:06
267 查看
题目:
设计包含min函数的栈。
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
要求函数min、push以及pop的时间复杂度都是O(1)。
思路:
用数组就可以实现栈,并且stl的实现原理也确实是那样的。push和pop的复杂度是O(1)很好保证,但是min呢?很明显,如果可以直接return最小值,那么min的复杂度必然是O(1)。由此为栈增加一个变量min_value,这个值存放的就是最小的那个数。
对于进栈,如果新进入的数比min_value的值还要小那么就用这个更小的数替换min_value。这样每次进栈都保证了min返回的是最小的数,但是如果出栈如果正好是出的最小的数呢?如果最小的数出栈,那么应该将第二小的数设置为min_value。而第二小的数已经被替换了。所以我们在进栈的更新min_value值的时候就要保存第二小的数到栈中,然后再用最小的值最后min_value。
代码如下:
这个问题给我带来几点启发:
这是一个面试题,用已有的数据结构构造新的数据结构是解题的路径,不需要自己从头到尾的去构造已有的数据结构;代码中,我就直接使用的stl中的stack数据结构;
用min_value一直保存最小值的思想和擂台赛的原理已有的,也就是用O(n)的复杂度找出数组的最小/大值的方法。在这个问题中,引入辅助栈,就将这个“擂台”的过程保留下来啦,是擂台赛算法的进一步应用;
设计包含min函数的栈。
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
要求函数min、push以及pop的时间复杂度都是O(1)。
思路:
用数组就可以实现栈,并且stl的实现原理也确实是那样的。push和pop的复杂度是O(1)很好保证,但是min呢?很明显,如果可以直接return最小值,那么min的复杂度必然是O(1)。由此为栈增加一个变量min_value,这个值存放的就是最小的那个数。
对于进栈,如果新进入的数比min_value的值还要小那么就用这个更小的数替换min_value。这样每次进栈都保证了min返回的是最小的数,但是如果出栈如果正好是出的最小的数呢?如果最小的数出栈,那么应该将第二小的数设置为min_value。而第二小的数已经被替换了。所以我们在进栈的更新min_value值的时候就要保存第二小的数到栈中,然后再用最小的值最后min_value。
代码如下:
#include <stack> #include <iostream> using namespace std; template <typename T> class m_stack { public: m_stack(void){ min_value = -1; } virtual ~m_stack(void){ } void pop(); void push(const T t); T min(); protected: private: stack<T> main_s;//主栈,用于存放数据 stack<int> temp_s;//辅助栈 T min_value; }; template <typename T> T m_stack<T>::min(){ return min_value; } template <typename T> void m_stack<T>::pop(){ if(main_s.size() != 0){ T t = main_s.top(); if(t == min_value){ if(temp_s.size() != 0){ min_value = temp_s.top(); temp_s.pop(); } } main_s.pop(); if(main_s.size() == 0)min_value = -1; } } template <typename T> void m_stack<T>::push(const T t){ if(main_s.size() == 0)min_value = t; main_s.push(t); if(min_value > t){ temp_s.push(min_value); min_value = t; } } void main(){ m_stack <int> s; s.push(9); cout << s.min() << endl; s.push(10); cout << s.min() << endl; s.pop(); s.pop(); s.pop(); s.pop(); cout << s.min() << endl; }
这个问题给我带来几点启发:
这是一个面试题,用已有的数据结构构造新的数据结构是解题的路径,不需要自己从头到尾的去构造已有的数据结构;代码中,我就直接使用的stl中的stack数据结构;
用min_value一直保存最小值的思想和擂台赛的原理已有的,也就是用O(n)的复杂度找出数组的最小/大值的方法。在这个问题中,引入辅助栈,就将这个“擂台”的过程保留下来啦,是擂台赛算法的进一步应用;
相关文章推荐
- 设计包含min函数的栈。
- 设计包含min函数的栈
- 每天学习一算法系列(3)--设计包含min函数的栈,要求函数min、push以及pop的时间复杂度都是O(1))
- 设计包含min函数的栈
- 程序员面试题精选100题(02)-设计包含min函数的栈
- 设计包含min函数的栈
- 经典面试题:设计包含min函数的栈,O(1)空间实现方法
- [程序员面试题精选100题]2.设计包含min函数的栈
- 设计包含min函数的栈
- 设计包含min函数的栈
- 设计包含min函数的栈[数据结构]
- 设计包含min函数的栈 C++实现
- 微软100题-第2题设计包含min函数的栈
- 算法3-设计包含min函数的栈
- 设计包含min函数的栈
- 设计包含min函数的栈
- 设计包含min函数的栈,O(1)空间实现方法
- 设计包含min函数的栈
- 微软等面试100题第二题:设计包含min函数的栈
- 【转帖】设计包含min函数的栈