栈最小值查找

本文介绍了一种实现栈的数据结构,该栈能够在O(1)的时间复杂度内完成入栈、出栈及获取最小值的操作。通过使用两个栈,一个用于存储数据,另一个用于跟踪最小值,实现了高效的最小值查询。

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

实现一个栈,要求实现Push(入栈)、Pop(出栈)、Min(返回最小的操作数)的时间复杂度为o(1)

对于前两个要求许多人都能做出来,需要思考的是最后一个,返回最小的操作数,要注意在每次入栈出栈的操作完成后,最小数的改变必须考虑,尤其是在出栈操作顺序完成后,若是最小数被Pop,那么,如何获得当前的最小数等问题。

采用的方法是

    

定义两个栈:


将第一个数压栈,因为两个栈都为空 所以直接压栈

在压第n个数时,功能栈直接压栈,记录最小数栈,则须比较,如果栈顶数比第n数小,则将栈顶数再次压栈,否则,就将第n数压栈.

结果如下图:


出栈pop时,两个栈同时直接pop就可以了,min查找直接return mindata的栈顶元素即可。

代码如下:

class Solution {
public:
	void push(int value) {
		data.push(value);
		if (mindata.empty() || value <= mindata.top())
			mindata.push(value);
		else
		{
			mindata.push(mindata.top());
		}
	}
	void pop() {
		data.pop();
		mindata.pop();
	}
	int top() {
		return data.top();
	}
	int min() {
		return mindata.top();
	}
private:
	stack<int> data, mindata;
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值