设计包含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;}
这个问题给我带来几点启发:
- 这是一个面试题,用已有的数据结构构造新的数据结构是解题的路径,不需要自己从头到尾的去构造已有的数据结构;代码中,我就直接使用的stl中的stack数据结构;
- 用min_value一直保存最小值的思想和擂台赛的原理已有的,也就是用O(n)的复杂度找出数组的最小/大值的方法。在这个问题中,引入辅助栈,就将这个“擂台”的过程保留下来啦,是擂台赛算法的进一步应用;
- 设计包含min函数的栈
- 设计包含min函数的栈
- 转载 设计包含min函数的栈
- 设计包含min函数的栈
- 设计包含min函数的栈
- 设计包含 min 函数的栈
- 设计包含min函数的栈
- 2.设计包含min函数的栈
- 2、设计包含min 函数的栈
- 设计包含min函数的栈---Algorithms
- 设计包含min函数的栈
- 设计包含min函数的栈
- 设计包含min函数的栈
- 2.设计包含min函数的栈
- 设计包含min函数的栈
- 设计包含min函数的栈
- 设计包含min函数的栈
- 设计包含min函数的栈
- 今日事今日毕
- FusionCharts (C/S)小案例
- Missing artifact com.sun:tools:jar:1.5.0:system 问题
- java——继承设计的技巧
- 看一遍那些晦涩的网络术语都弄明白
- 设计包含min函数的栈
- 11个强大的Visual Studio调试小技巧
- 纪念一次Ubuntu8.04下的GTK源码安装经历
- 设计模式(3)观察者模式
- window启动FTP服务器方法之一
- 在VS2010平台上创建并使用dll
- j-ui dwz j-ajax 重复刷新问题。
- 吐槽
- 解决JSP参数传递乱码的问题