IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> leetcode155. 最小栈 -> 正文阅读

[数据结构与算法]leetcode155. 最小栈

设计一个支持push、pop、top操作,并能在常数时间内检索到最小元素的栈。

  • push(x) —— 将元素x推入栈中。
  • pop( ) —— 删除栈顶的元素。
  • top( ) —— 获取栈顶元素。
  • getMin( ) —— 检索栈中的最小元素。

提示: pop、top和getMin操作总是在非空栈是调用。

示例:
?输入:[“MinStack”, “push”, “push”, “push”, “getMin”, “pop”, “top”, “getMin”]
????[[ ], [-2], [0], [-3], [ ], [ ], [ ], [ ]]
?输出:[null, null, null, null, -3, null, 0, -2]

思路一:
使用两个栈,一个栈用于存储数据(数据栈),另一个栈用于存储数据栈对应位置向下的最小值(最小栈)。
例如,-2入栈时栈为空,则该位置向下的最小值就是-2本身,于是-2入最小栈;接着0入栈,该位置向下的最小值是-2,则-2继续入最小栈;最后-3入栈,该位置向下的最小值就是-3了,则将-3入最小栈。若是数据栈需要出栈,则最小栈也跟着进行出栈操作。
在这里插入图片描述
这样一来,无论什么时候,最小栈的栈顶元素都是数据栈中的最小元素。

代码如下:

class MinStack {
public:
	/** initialize your data structure here. */
	MinStack() {
		//构造函数无需编写,使用默认构造函数即可
	}

	void push(int val) {
		_st.push(val); //将val压入数据栈
		if (_minst.empty() || val < _minst.top()) //若val比最小栈的栈顶元素小,则将val压入最小栈
		{
			_minst.push(val);
		}
		else //若val比最小栈的栈顶元素大,则将最小栈栈顶元素压入最小栈
		{
			_minst.push(_minst.top());
		}
	}

	void pop() {
		_st.pop(); //数据栈进行pop
		_minst.pop(); //最小栈进行pop
	}

	int top() {
		return _st.top(); //返回数据栈栈顶元素
	}

	int getMin() {
		return _minst.top(); //返回最小栈栈顶元素
	}
private:
	stack<int> _st; //数据栈
	stack<int> _minst; //最小栈
};

/**
 1. Your MinStack object will be instantiated and called as such:
 2. MinStack* obj = new MinStack();
 3. obj->push(val);
 4. obj->pop();
 5. int param_3 = obj->top();
 6. int param_4 = obj->getMin();
*/

思路二:
实际上我们可以发现,如果入栈数据当中存在大量连续数据都比已经入栈的数据要小,按照思路一的方法进行操作,则最小栈当中就会出现许多连续且相同的数据。
在这里插入图片描述
为了解决这个问题,我们可以改变最小栈的入栈规则:

  1. 若最小栈为空,则数据栈入数据,最小栈也跟着入数据。
  2. 若压入数据栈的数据比最小栈栈顶的元素大,则最小栈不进行任何操作。
  3. 若压入数据栈的数据比最小栈栈顶的元素小或是相等,则最小栈也跟着数据栈入数据。

当然,我们也需要重新制定最小栈的出栈规则:

  1. 若数据栈出栈数据与最小栈栈顶元素相等,则最小栈也跟着出栈。
  2. 若数据栈出栈数据与最小栈栈顶元素不同,则最小栈不进行任何操作。

在这里插入图片描述
代码如下:

class MinStack {
public:
	/** initialize your data structure here. */
	MinStack() {
		//构造函数无需编写,使用默认构造函数即可
	}

	void push(int val) {
		_st.push(val); //将val压入数据栈
		if (_minst.empty() || val <= _minst.top()) //最小栈为空或val小于等于最小栈栈顶元素
		{
			_minst.push(val); //最小栈也跟着数据栈入数据
		}
	}

	void pop() {
		if (_minst.top() == _st.top()) //最小栈与数据栈栈顶元素相同
		{
			_minst.pop(); //最小栈也跟着出栈
		}
		_st.pop(); //数据栈出栈
	}

	int top() {
		return _st.top(); //返回数据栈栈顶元素
	}

	int getMin() {
		return _minst.top(); //返回最小栈栈顶元素
	}
private:
	stack<int> _st; //数据栈
	stack<int> _minst; //最小栈
};

/**
* Your MinStack object will be instantiated and called as such:
* MinStack* obj = new MinStack();
* obj->push(val);
* obj->pop();
* int param_3 = obj->top();
* int param_4 = obj->getMin();
*/
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-12 13:24:22  更:2021-09-12 13:24:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 12:32:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码