设计包含min函数的栈

来源:互联网 发布:js 0是true还是false 编辑:程序博客网 时间:2024/05/04 23:52

题目:

设计包含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;}

这个问题给我带来几点启发:

  1. 这是一个面试题,用已有的数据结构构造新的数据结构是解题的路径,不需要自己从头到尾的去构造已有的数据结构;代码中,我就直接使用的stl中的stack数据结构;
  2. 用min_value一直保存最小值的思想和擂台赛的原理已有的,也就是用O(n)的复杂度找出数组的最小/大值的方法。在这个问题中,引入辅助栈,就将这个“擂台”的过程保留下来啦,是擂台赛算法的进一步应用;



原创粉丝点击