C++的STL栈实现获取栈中最小元素的成员
实现一个获取栈中最小数据成员的函数,该栈支持如下操作:
1.push(x) : 将元素x压入栈中
2.pop() : 弹出(移除)栈顶元素
3.top() : 返回栈顶元素
4.getMin() : 返回栈内最小元素
要求时间复杂度为O(1)
这里关键是如何获取最小值,栈中的元素不断增加,且要达到O(1)常数级的时间复杂度,即创建好的栈进行排序,返回最小值是不可行的。
这里只有在创建过程中将栈中的最小值获取到,此时一个可行的办法为:
维护一个最小栈,保持栈顶元素为所有元素的最小值,且大小与原本数据栈保持一致。
这样即使有原本数据的删除添加,最小栈同样跟随数据删除添加即可。
方法一(一个栈):
数据结构实现如下:
void push(int x) {data_stack.push(x);/*当最小栈中的元素不为空的时候,和栈顶元素进行大小比较,判断是否要入栈*/if (!min_stack.empty()) {if (min_stack.top() > x) {min_stack.push(x);}else {min_stack.push(min_stack.top());}}/*为空的时候即可入栈*/else {min_stack.push(x);}
}
/*此时最小栈的栈顶即为数据栈中的最小元素*/
int get_min(){return min_stack.top();
}
方法二(两个栈):
class MinStack {stack<int> S;int min=2147483647;
public:/** initialize your data structure here. */MinStack() {}//push操作void push(int x) {if (x <= min) { //当遇到小于等于最小值的数值,将上一个最小值也push到栈中S.push(min);min = x;}S.push(x);}void pop() {if (S.top() == min) { //pop的时候发现pop的时最小值,那么pop两次,同时变更最小值S.pop();min = S.top();S.pop();} else {S.pop();}}int top() {return S.top();}int getMin() {return min;}
};
测试代码实现如下:
#include <stack>
#include <iostream>
#include <algorithm>using namespace std;class My_stack{private:stack<int> data_stack,min_stack;public:void push(int x) {data_stack.push(x);if (!min_stack.empty()) {if (min_stack.top() > x) {min_stack.push(x);}else {min_stack.push(min_stack.top());}}else {min_stack.push(x);}}void pop() {min_stack.pop();data_stack.pop();}int top() {return data_stack.top();}int get_min(){return min_stack.top();}
};int main(){My_stack s;int tmp;cout << "construct the stack " << endl;while(cin >> tmp) {s.push(tmp);}cout << "min is " << s.get_min() << endl;s.pop();cout << "after pop " << s.top() << endl;s.push(-4);cout << "after push ,the top and min is " << s.top() << " " << s.get_min() << endl;return 0;
}
输出如下:
construct the stack
2 -1 -3 2 0 4
d
min is -3
after pop 0
after push -4,the top and min is -4 -4
相关文章:

java servlet applet,详解Java Servlet与Applet比较
Java Servlet与Applet相似之处:◆它们不是独立的应用程序,没有main()方法。◆它们不是由用户或程序员调用,而是由另外一个应用程序(容器)调用。◆它们都有一个生存周期,包含init()和destroy()方法。Java Servlet与Applet不同之处&…

NTP时间同步服务器搭建
转载:http://blog.s135.com/post/281/ 一、搭建时间同步服务器1、编译安装ntp server tar zxvf ntp-4.2.6.tar.gzcd ntp-4.2.6./configure --prefix/usr/local/ntp --enable-all-clocks --enable-parse-clocksmake && make install注:如以上下载…

OI基础系列之最大子数组问题
OI基础系列之最大子数组问题 ——Edward2414 oi退役了,虽然没取得多少成绩,也算是走过一会的人了。我相信绝大多数oi党都是自学成才,在此,我感谢那些把自己所学写到博客里的前辈们,没有你们,我不可能…

springCloud Zuul网关
1.springboot 仅2.0.x 支持,在此选择 2.0.7 2.新建Module eureka-zuul-client 3.导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/…

f-free 查看系统中空闲和使用的内存
文章目录前言语法格式以指定单位显示内存占用情况打印所有内存占用(RAM SWAP)打印间隔以及次数打印所有的列(将buff和cache分开)free各个空间含义swap交换空间cache页高速缓存free 与 available前言 free 支持查看空闲的和已使用…

对比两个同类型的泛型集合并返回差异泛型集合 ——两个List类名的比较
1: /// <summary> 2: /// 对比两个同类型的泛型集合并返回差异泛型集合 3: /// </summary> 4: /// <typeparam name"T">泛型类型</typeparam> 5: /// <param name"newModel">修改后的数据集合</param> 6: /// &…

php insert failed,较大的MySQL INSERT语句导致PHP错误
好吧,我正在编写代码,但是发生了一些奇怪的事情,我不认为我的代码是错误的…但是它仍在垂死,我不知道为什么…有错误:Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use …

js 取得文件大小
document.getElementById("file").files[0].size

Spring Boot thymeleaf模版支持,css,js等静态文件添加
Thymeleaf引入 Thymeleaf是一个Java模板引擎开发库,可以处理和生成HTML、XML、JavaScript、CSS和文本,在Web和非Web环境下都可以正常工作。 1.添加依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>…

s-sed(stream editor) 文本填充和编辑 基本使用
文章目录前言语法格式sed 操作地址sed子命令sed正则表达式sed使用实例打印命令 p删除命令 d替换命令 s指定操作地址的范围 逗号 ,多重编辑命令 e下行插入命令 a上行插入命令 i修改命令 c获取下一行命令 n转换命令 y退出命令 q总结前言 sed是一个“非交互”式的字符流编辑器&am…
c语言动态迁移mysql,flask-migrate动态迁移数据库
了解flask_migrate需要先了解flask-script,那么flask-script的作用是什么呢?flask-script的作用是可以通过命令行的形式来操作Flask。例如通过命令跑一个开发版本的服务器、设置数据库,定时任务等。2.执行pip install flask-script来进行安装…

软考之路-网络攻击:主动攻击和被动攻击
被动攻击(针对路上的东西下手) 概念:就是网络窃听,窃取数据包并进行分析,从中窃取重要的敏感信息 措施:防止被动攻击的主要手段是数据加密传输 主动攻击(针对计算机下手) 概念:包括窃取、篡改、假冒和破坏 措施&#x…
edge.js架起node.js和.net互操作桥梁
今天要介绍的是edge.js这个github上刚兴起的开源项目,它可以让node.js和.net之间在in-process下互操作。.net版本在4.5及以上,因为.net4.5带来的Task,asyn,await关键字和node.js的Event模型正好匹配。如果你感兴趣的话,…

connect() failed (111: Connection refused) while connecting to upstream, cli
php-fpm没有运行 执行如下命令查看是否启动了php-fpm,如果没有则启动你的php-fpm即可 netstat -ant | grep 9000没有运行为空,有运行显示 tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 启动方法 sudo /usr/loca…

C++的STL 栈实现 判断栈的出栈顺序是否合理
有这样的题目: 已知从1至n的数字序列,按顺序入栈,每个数字入栈后即可出栈, 也可在栈中停留,等待后面的数字入栈出栈后,该数字再出栈,求该数字序列的出栈序列是否合法? 类似如下: 已…

fire.php,Fire PHP
项目介绍: Fire PHP 是基于 PHP JavaScript开发的跨平台的Firefox 的扩充套件,即PHP调试插件,可以帮你debug 后端PHP 的程式,其使用的技术跟某些IDE 一样,要求你在写程式时加入一些追踪用的代码。通过使用Firephp你可以…

json_encode时中文编码转正常状态
function json_encode_cn($data) {$data json_encode($data);return preg_replace("/\\\u([0-9a-f]{4})/ie", "iconv(UCS-2, UTF-8, pack(H*, $1));", $data); }直接json_encode()函数 ["\u6fb3\u5927\u5229\u4e9e","\u8056\u8a95\u5cf6&q…

验证URL链接和IP有效性的JS代码(正则表达式)
千里之行,始于足下,因之前毕业设计的耽误,没能在博客园记录我的程序猿体会,稍有遗憾,这么多的时间,我竟让他转瞬而过!但没关系,再次出发,勿忘为什么出发! 一下…

[转帖]什么是光纤的波长?看看有哪些是你不知道的!
什么是光纤的波长?看看有哪些是你不知道的! FShttps://www.feisu.com/bbs/e-1640.html2017-07-01 00:00:001084我们平时最熟悉的光当然是我们肉眼所能看见的光。我们的眼睛对波长在400nm的紫光到700nm的红光很敏 感。但对于携带玻璃纤维的光纤࿰…

C++的STL 栈 实现四则运算
使用栈实现四则运算,支持,-,*,/,(,) 输入为字符串,输出为计算好的数值,如不符合四则运算的规定,则异常退出 这个实现借用了栈以及字符处理状态机的思想: 维…

javascript小数相减会出现一长串的小数位数的原因
javascript小数相减会出现一长串的小数位数的原因 <script>var a38.8;var b6.8;alert(parseFloat(a)-parseFloat(b));var a134.22;var b6;alert(a*b);</script>以上代码为什么产生一长串小数位出来,虽然比较精确,可没必要呀。这个和数据结构…

Java孩子父母类,@Output孩子和父母之间的沟通 . 角2(5)
我正在尝试学习角度2,并且我正在尝试使用来自我的子组件的数据在父组件中设置变量 . 基本上我在父视图中有一个子 Headers ,我希望 Headers 和一些HTML根据加载的子项进行更改 .父组件:import { Component, OnInit, ViewEncapsulation } from…

SQL 自学笔记1(W3School)
自学W3Schoolhttp://www.w3school.com.cn/sql/index.asp 简介 SQL是什么? Structured Query Language 结构化的查询语言 SQL能做什么? 面向数据库查询、取出数据、插入新数据、更新数据、删除数据在数据库中建立库、表;创建存储过程及视图可设…
BZOJ 1096: [ZJOI2007]仓库建设
传送门 斜率优化DP入门题 显然如果在一个位置 i 建一个仓库,且上一个仓库位置为 j 那么从 j1到 i 的物品显然都要存在 i 仓库是最优的 设 $f [ i ]$ 表示在第 i 个工厂建设仓库时,工厂 1 到 i 的物品都转移好的最小花费 考虑上一个仓库的位置 j 设工厂 i…

C++的STL 堆 实现获取数组堆第K大的数
前言 堆数据结构 使用的是优先级队列实现,创建堆的时候需要指定堆中元素的排列方式,即最大堆或者最小堆 最大堆即 堆顶元素为堆中最大的元素 最小堆即 堆顶元素为堆中最小堆元素 如下为一个最大堆 回到文章标题,获取一个数组中第K大的数&a…

HTML+CSS布局技巧及兼容问题【阅读季】
在IE6和IE7中,行高值必须大于字体的2px以上才能保证字体的完整显示或当作为链接时能显示下划线。 IE6 下去掉 input等元素 的边框 border: 0 none; 所有浏览器都可以了 边框1px {td不重叠状态}:border-collapse: collapse;(table、td需同时…

php 去掉数组相同元素,php怎么去掉数组中重复的元素
php去掉数组中重复的元素的方法:可以通过内置函数array_unique()来实现。array_unique()函数可以移除数组中重复的值并返回过滤后的数组。如果数组中存在多个相同元素,则只保留第一个值。php为我们提供了专门的内置函数array_unique()来解决此问题。该函…

Office文件的奥秘——.NET平台下不借助Office实现Word、Powerpoint等文件的解析(完)...
原文 http://www.cnblogs.com/mayswind/archive/2013/04/01/2991271.html 【题外话】 这是这个系列的最后一篇文章了,为了不让自己觉得少点什么,顺便让自己感觉完美一些,就再把OOXML说一下吧。不过说实话,OOXML真的太容易 解析了&…

Makefile (2) gdb
gdb调试 1.用debug的方式编译 -g 2.打上断点 3.单步调试 step into 进入函数里面step over 运行整个函数step return 跳出当前函数 4.继续运行 5.打印和监控值 下面是栗子: 1 #include <stdlib.h>2 #include <stdio.h>3 4 static int add(int i) //创…

C++的 STL堆 实现获取中位数
前言 堆数据结构 使用的是优先级队列实现,创建堆的时候需要指定堆中元素的排列方式,即最大堆或者最小堆 最大堆即 堆顶元素为堆中最大的元素 最小堆即 堆顶元素为堆中最小堆元素 如下为一个最大堆 中位数: 一组数排序后,如果元…