min栈实现

2023-05-16

题目:


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


分析:


这道题目的主要难点在于Min的实现,因为由栈本身的特性,只能在栈顶进行操作,所以push(入栈)、pop(出栈)本身的时间复杂符就是O(1),对于min函数来说从栈自身的特点来说显然是没有O(1)的时间复杂度能完成的,所以可以考虑添加辅助栈,利用栈的自身操作实现或者辅助数组来通过下标访问达到要求。既然本篇是主要针对栈和队列面试题来说的,下面就采取辅助栈的方式进行分析。


示例:

示例一:给定一个输入栈1 2 3 4 5,将其压栈,那么每次min函数返回的应该都是1才合理;

示例二:给定一个输入栈2,4,5,1,3那么辅助栈中第一次min的值应该为1,在pop一次还是1,其余的pop才是2才合理;


具体步骤分析:


(1)第一次应为辅助栈和当前栈都为空,所以辅助栈直接push当前栈的数据;

(2)第二次压入数据时,当前栈直接push,取当前栈的栈顶元素和辅助往后push元素时都重复上述(2)和(3)步骤;

(5)pop操作时,当前栈和辅助栈的元素同时pop就好;

优化上述步骤:

(3)若当前栈的栈顶元素小于辅助栈的栈顶元素,将当前栈的栈顶元素压入辅助栈;

(5)pop时当前栈直接pop,辅助栈中则需要进行比较,只有当辅助栈的栈顶元素小于等于当前栈的栈顶元素时才进行pop操作;栈的栈顶元素作比较;

(3)若当前栈的栈顶元素小于辅助栈的栈顶元素,将当前栈的栈顶元素压入辅助栈,否则将辅助栈的栈顶元素压入到辅助栈中;



图示举例:




代码实现(直接给出优化后的实现):


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

template<class T>
class Stack
{
public:
	void Push(const T& data)
	{
		s.push(data);
		if (min.empty())
		{
			min.push(data);
		}
		else
		{
			if (s.top() <= min.top())
				min.push(data);
		}
	}

	void Pop()
	{
		if (s.top() == min.top())
			min.pop();
		s.pop();
	}

	T& Min()
	{
		assert(!min.empty());
		return min.top();
	}

protected:
	stack<int> s;
	stack<int> min;
};

int main()
{
	Stack<int> s1;
	s1.Push(2);
	s1.Push(4);
	s1.Push(5);
	s1.Push(1);
	s1.Push(3);
	cout <<"当前栈中的最小值是:"<< s1.Min() << endl;
	s1.Pop();
	s1.Pop();
	s1.Pop();
	cout <<"pop三次之后当前栈中的最小值是:"<< s1.Min() << endl;

	system("pause");
	return 0;
}

程序运行结果:





本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

min栈实现 的相关文章

  • RandomForestClassifier参数min_samples_leaf和min_samples_split理解

    而min samples split限定 xff0c 个结点必须要包含 少min samples split个训练样本 xff0c 这个结点才允许 被分 xff0c 否则分 就不会发 min samples leaf限定 xff0c 个结点
  • C++_自定义函数实现返回两个数中的较小数

    本文仅仅发布在CSDN我的博客 点击打开链接 http blog csdn net pythontojava viewmode contents 转载请注明出处 我用的IDE是VS2013 代码在vc 6 0不能编译 要把int tmain
  • min_member/2 的反直觉行为

    最小成员 分钟 列表 当 Min 是标准项顺序中最小的成员时为真 如果列表为空 则失败 min member 3 1 2 X X 3 当然 解释是变量在术语的标准顺序中位于所有其他术语之前 并且使用统一 然而 所报告的解决方案感觉有些错误
  • Python:找到最小元素的最后一个索引?

    例如 1 2 3 4 1 2 具有最小元素 1 但它最后一次出现在索引 4 处 gt gt gt values 1 2 3 4 1 2 gt gt gt min x i for i x in enumerate values 1 4 无需修
  • C++ 中 min 和 max 函数的使用

    从 C 来看 有std min and std max优于fmin and fmax 为了比较两个整数 它们提供基本相同的功能吗 您是否倾向于使用这些函数集中的一组 还是更喜欢编写自己的函数 也许是为了提高效率 可移植性 灵活性等 Note
  • 从列表中获取 min() 和 max() 的有效方法? [复制]

    这个问题在这里已经有答案了 我的问题来自发布到的答案如何在python 3中找到任意列表中缺失的数字 大多数解决方案建议使用类似的东西 a 10 12 13 8 get set of full numbers allNums set x f
  • 将减法结果限制为最小值为零

    我有一个向量 x 其值范围从 0 到 1 例如x lt c 0 0 5 1 我从 x 中减去 0 5 x 0 5 的结果x 0 5范围从 0 5 到 0 5 但是 我想将结果的最小值限制为 0 即新的范围将为 0 5 到 0 任何以前的负数
  • MAX/MIN 在 mysql 中给了我错误的值

    我正在尝试获取MAX or the MIN 数据集的值 样本数据 equipment id value updateTimestamp 77 81 57 2013 05 28 12 00 00 77 89 56 2013 05 28 13
  • 如何使用python从csv文件中提取最小值和最大值

    我有一个 python 脚本 它从 csv 文件读取并将请求的列附加到 2 个空列表中 之后我需要提取提取的列的最小值和最大值 我写了这段代码 但它似乎不起作用 因为结果是空的 code import csv mydelimeter csv
  • 为什么 python max('a', 5) 返回字符串值?

    追溯一个ValueError cannot convert float NaN to integer我发现该行 max a 5 max 5 a 将返回a而不是 5 在上面的例子中我使用了示例字符串a但在我的实际情况下 字符串是NaN 拟合过
  • R:尽可能均匀地分配数量 II

    我们有一定的数量 例如300 单位 该数量应尽可能均匀地分布在 40 个 槽 或 箱 中 如果每个槽都相同 那就很容易了 所以每个槽都是 7 5 然而 插槽的大小各不相同 我们不能 填充 超过其 大小 允许的范围 例如如果只有 4 个 我们
  • 如何从一组输入的数字中获取最大值和最小值?

    以下是我到目前为止所拥有的 我不知道如何排除 0 作为最小数字 分配要求 0 作为退出编号 因此我需要在最小字符串中出现除 0 之外的最小数字 有任何想法吗 int min max Scanner s new Scanner System
  • Python 最小值/最大值的关键字函数

    我试图理解这是如何工作的 my dict a 2 b 1 min my dict key my dict get produces b 这是一项非常酷的功能 我想更好地了解它 基于文档 分钟 可迭代 键 返回可迭代中的最小项或两个或多个参数
  • 返回所有可以是多个的最大或最小值

    Enumerable max by and Enumerable min by return one当接收器中有多个最大 最小元素时 相关元素 大概是第一个 的 例如 以下内容 1 2 3 5 max by e e 3 仅返回2 或仅5 相
  • 与同时使用 minmax_element 相比 min_element 和 max_element 是否有任何效率优势?

    std minmax element 返回一个对 其中包含一个到最小元素的迭代器作为第一个元素 一个到最大元素的迭代器作为第二个元素 std min element 返回一个迭代器到范围 first last 中的最小元素 std max
  • 从文件输入中查找java中的最大值

    我是Java新手 我正在尝试编写一个程序 要求用户输入仅包含数字的txt文件的名称 该程序将输出文件中数字的总和 平均值 最大值和最小值 我已经编写了程序的大部分内容 但是我一直在尝试找到值的最大值和最小值 您提供的任何信息都会有所帮助 如
  • 从具有 NaN 的多维数组中找出最小值

    我有一个二维数组 double 我想知道最小值是多少 我尝试了 Linq Select Min 但由于我的数组通常包含NaN值 那么minvalue总是NaN 因此 我需要某种方法来找到 跳过 NaN 的最小值 任何帮助深表感谢 今天是扩展
  • 查找数组中的最小值[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有两个数组 int playerSums 9 string playerNames 9 我正在尝试获取最小值在数组中p
  • 使用 Python min() max() 避免数值的字典顺序

    我有一个脚本可以从一组值中提取随机数 然而 今天它崩溃了 因为min and max 按字典顺序对值进行排序 因此 200 被视为大于 10000 我怎样才能避免这里的字典顺序 Len关键是在正确的轨道上 但并不完全正确 我找不到任何其他有
  • 最小元素错误

    我不是 C 编码员 所以也许这很容易 我有一个 Point 类向量 我想找到 AABB 矩形 最小 x 最小 y 最小 x 最大 y 最大 x 最小 y 最大 x 最大 y 我已经完成了一个 for 循环 保存最小值和最大值 一次用于 x

随机推荐

  • atoi函数实现的各种考虑因素

    define CRT SECURE NO WARNINGS 1 include lt stdio h gt atoi实现 xff1a 将一个字符串转换为对应的整数 enum Status 定义两个枚举常量判断所给变量是否合法 kValid
  • 继承小结

    1 概念 面向对象程序设计使代码可以实现复用的最重要手段 xff0c 允许程序员在原有类特性的基础上进行扩展 xff0c 增加新的功能 2 定义格式 xff1a 首先是一个冒号 xff0c 后面紧跟以逗号分隔的基类列表 xff0c 其中每个
  • 到底多态有多难

    1 概念 多态 简单来说就是一种事物具有多种形式或者形态的特征 xff0c 好比我们生活中最简单的事物 xff0c 就像每天都会用到的水 xff0c 水有三态 xff0c 即固态 液态和气态 生活中这种多多态的例子很多 xff0c 同样在我
  • 解析模板(上)--模板函数

    模板引出 xff1a 在学习关于类的特性中 xff0c 有一个重要的特性叫做多态 xff0c 同样关于模板的学习也可以简单的把它理解成一种多态 xff0c 只不过模板中所涉及的多态是关于类型的替换 xff0c 正如在生活中使用模具一样 xf
  • 模板&仿函数的应用--冒泡排序

    普通版冒泡排序 对于冒泡排序的算法大家并不陌生 xff0c 将相临两个数一次比较 xff0c 然后将最大值或者最小值先排出来 xff0c 一般来说这样的话我们需要在碗面写两个函数来分别实现这两个算法 xff0c 程序代码如下 xff1a s
  • String类模拟

    span style font size 24px class String friend ostream amp operator lt lt ostream amp os String amp s 输出运算符重载 friend istr
  • win10主机ping不通win10虚拟机

    原因是ICMP回显请求规则未开启 xff0c 解决方法在文章末尾 环境说明 win10虚拟机 192 168 136 136 win10虚拟机采用的网络连接是 NAT 模式 ipconfig结果如下 xff1a 以太网适配器 Etherne
  • <操作系统> 理发店问题(选做)C语言实现

    问题描述 xff1a 代码 xff1a span class token macro property span class token directive keyword include span span class token str
  • 特殊矩阵的压缩存储及转置

    一 对称矩阵及其压缩存储 1 对称矩阵 在矩阵中最特殊的一类应该属于对称矩阵 xff0c 对称矩阵的行和列是对应相等的 对称矩阵就是关于主对角线对称 xff0c 两边的元素的值对应相等 xff0c 在数学中我们把用主对角线隔开 xff0c
  • STL浅析set&map

    map和set的底层实现原理和接口使用 1 set和map的底层实现 set和map属于STL中的一种关联式容器 xff0c 底层实现是红黑树 2 set容器的特点 1 set和map 容器中的元素自动进行有序排列 默认为升序排列 xff1
  • Linux下的文件操作权限

    Linux下进入一个目录需要什么权限 xff1f 普通用户下 xff1a 首先我们在普通用户下 xff0c 取消文件code的所有权限chmod 000 code 当我们执行cd code 想进入当前目录时 xff0c 发现权限不允许 接下
  • linux下的常见命令

    cd change directory 进入个人的主目录 cd home 进入 39 home 39 目录 39 cd 返回上一级目录 cd 返回上两级目录 cd 返回上次所在的目录 ls list 查看目录中的文件 ls l 显示文件和目
  • task_struct结构体成员小结

    背景知识 task stuct结构体 被称为进程描述符 xff0c 用 来管理进程Linux内核的进程 xff0c 这个结构体包含了一个进程所需的所有信息 它定义在 include linux sched h文件中 可以说它是linux内核
  • Linux下的简单进度条实现

    进度条 计算机在处理任务时 xff0c 实时的 xff0c 以图片形式显示处理任务的速度 xff0c 完成度 xff0c 剩余未完成任务量的大小 xff0c 和可能需要处理时间 xff0c 一般以长方形条状显示 主要功能 xff1a 1 显
  • 九大排序之——希尔排序

    希尔排序 xff1a 思想 xff1a 希尔排序是为了防止直接插入排序出现最坏情况所做的一种改进 xff0c 将原本的排序过程分为预排序和直接插入排序两个阶段 预排序阶段 xff1a 将整个预排序的序列分为若干个待排序的子序列 xff0c
  • 僵尸进程与孤儿进程模拟实现

    背景知识 僵尸进程 xff08 Zombies xff09 xff1a 1 僵尸进程是一个比较特殊的状态 xff0c 当进程退出父进程 xff08 使用wait 系统调用 xff09 没有没有读取到子进程退出的返回代码时就会产生僵尸进程 僵
  • 队列模拟实现

    队列的特点 xff1a 先进先出 后进后出 队列的常见操作 xff1a Push 往队尾插入一个元素 Pop 从队头删除一个元素 Front 返回队列的第一个元素 Back 返回队列的最后一个元素 Size 求队列的元素个数 Empty 判
  • ssh端口转发(之kettle ssh方式连接数据库)

    ssh参数解释 格式 ssh user 64 host command 选项 xff1a 1 xff1a 强制使用ssh协议版本1 xff1b 2 xff1a 强制使用ssh协议版本2 xff1b 4 xff1a 强制使用IPv4地址 xf
  • str库函数模拟实现

    常见str函数功能表 xff1a strcat 将字符串str2连接到str1之后 xff0c 并返回指针str1 strncat 将字符串from 中至多count个字符连接到字符串to中 xff0c 追加空值结束符 返回处理完成的字符串
  • min栈实现

    题目 xff1a 实现一个栈 xff0c 要求实现Push xff08 出栈 xff09 Pop xff08 入栈 xff09 Min xff08 返回最小值的操作 xff09 的时间复杂度为O 1 分析 xff1a 这道题目的主要难点在于