【面试题】剑指offer21--求栈里面的最小的数字

本文介绍了一种特殊栈的设计方案,此栈能在O(1)时间内获取最小元素。通过维护一个辅助栈来记录每次入栈时的最小值,确保了在任何时候都能快速找到最小值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素min函数。

在该栈中,调用min,push以及pop的时间复杂度都是O(1)。

首先,我们想到的方法是,在每一次入栈的时候比较一下,把小的数字放到上边,最后就可以得到最小的数字了。

但是这种方法就不能保证最先入栈的数字最后出栈,不符合栈的规则了。

于是我们想到了另外一种方法:

首先往空的数据栈里面压入一个数字5,现在最小的数字是5,我们将这个最小的数字也压入辅助栈。

接下来压入3,由于3小于之前的5,于是我们往辅助栈里面的数字更新为3。

继续往栈里面压入数字6,由于6大于之前的3,辅助栈里面压入的还是3。

继续也如数字2,由于2小于3,则辅助栈里面的数字更新为2。

再压入一个数字1,由于1小于2,辅助栈的数字更新为1。

于是最小的数字就是1。


使用代码实现:

#include<iostream>
using namespace std;
#include<stack>
#include<assert.h>
template<typename T>

class StackWithMin
{
public:
	void Push(const T& data)
	{
		s_Elem.push(data);
		if (s_Min.empty() || data < s_Min.top())
		{
			s_Min.push(data);
		}
		else
		{
			s_Min.push(s_Min.top());
		}
	}
	void Pop()
	{
		assert(!s_Min.empty() && !s_Elem());
		s_Min.pop();
		s_Elem.pop();
	}

	const T& Min()const
	{
		return s_Min.top();
	}
protected:
	stack<T> s_Elem;
	stack<T> s_Min;
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值