您的位置:首页 > 其它

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

代码如下:

#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)的复杂度找出数组的最小/大值的方法。在这个问题中,引入辅助栈,就将这个“擂台”的过程保留下来啦,是擂台赛算法的进一步应用;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: