设计包含min函数的栈

题目:

设计包含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)的复杂度找出数组的最小/大值的方法。在这个问题中,引入辅助栈,就将这个“擂台”的过程保留下来啦,是擂台赛算法的进一步应用;



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值