题目描述:实现一个包含min操作的栈,时间复杂度需要是O(1)

思路:一开始的想法是添加辅助栈保存当前最小元素,但是这样存在的问题就是不能处理重复元素;于是.....我还是google了,找到如下锦囊妙计

不需要额外的空间,栈顶保存的是最小元素,每次push比较,如果当前元素更小的话就更新栈顶,另外栈顶以下元素保存的是元素push的时候与

当时的最小值的差值;pop的时候,就是看栈顶元素后的下一个元素,如果小于零,说明当前需要pop最小元素,同时更新最小元素,如果大于零,

直接push(最小元素+差值)即可。有点混乱:

看例子:

3 5 2 1

push:

3

2 3

2 -1 2

2 -1 -1 1

pop:

2 -1 2 输出1

2 3 输出2

3 输出5

输出3

 1 #include <iostream>
 2 #include <queue>
 3 #include <climits>
 4 #include <algorithm>
 5 #include <memory.h>
 6 #include <stdio.h>
 7 #include <ostream>
 8 #include <vector>
 9 #include <list>
10 #include <cmath>
11 #include <string>
12 #include <stdexcept>
13 #include <stack>
14 using namespace std;
15
16 template<typename T>
17 class minStack
18 {
19 public:
20     T pop();
21     void push(const T& elem);
22     T min();
23     stack<T> s;
24 };
25 template<typename T>
26 void minStack<T>::push(const T&elem)
27 {
28     if(s.empty())
29     {
30         s.push(elem);
31         return;
32     }
33     T minval = s.top();
34     s.pop();
35     s.push(elem-minval);
36     if(elem < minval)
37     {
38         s.push(elem);
39     }
40     else
41         s.push(minval);
42     return;
43 }
44
45 template<typename T>
46 T minStack<T>::pop()
47 {
48     if(s.empty())
49         throw std::out_of_range("stack is empty");
50     T minval = s.top();
51     s.pop();
52     T val = s.top();
53     s.pop();
54     if(val <= 0)
55     {
56         s.push(minval - val);
57         val = minval;
58     }
59     else
60     {
61         s.push(minval);
62         val = minval+val;
63     }
64     return val;
65 }
66
67 int main()
68 {
69     return 0;
70 }

转载于:https://www.cnblogs.com/cane/p/3793510.html

面试金典--min栈的实现相关推荐

  1. 程序员面试金典——3.3集合栈

    程序员面试金典--3.3集合栈 Solution1:主要总结下关于vector不太常用的函数 (1)c.pop_back():删除vector对象c中最后一个元素,若c为空,则函数行为未定义.函数返回 ...

  2. 集合栈 牛客网 程序员面试金典 C++ Python

    集合栈 牛客网 程序员面试金典 C++ Python 题目描述 请实现一种数据结构SetOfStacks,由多个栈组成,其中每个栈的大小为size,当前一个栈填满时,新建一个栈.该数据结构应支持与普通 ...

  3. 双栈排序 牛客网 程序员面试金典 C++ Python

    双栈排序 牛客网 程序员面试金典 C++ Python 题目描述 请编写一个程序,按升序对栈进行排序(即最大元素位于栈顶),要求最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构中. ...

  4. 程序员面试金典(第 6 版)(简单篇)

    程序员面试金典 第6版 简单篇 简单篇 面试题 01.01. 判定字符是否唯一 面试题 01.02. 判定是否互为字符重排 面试题 01.03. URL化 面试题 01.04. 回文排列 面试题 01 ...

  5. 程序员面试金典3.1-3.6

    程序员面试金典3.1-3.6 文章目录 3.1 三合一 3.2栈的最小值 3.3 堆盘子(×) 3.4化栈为队 3.5栈排序 3.6动物收容所 3.1 三合一 题读不懂,直接上链接吧.就是让用一个数组 ...

  6. 程序员面试金典--第k个数

    程序员面试金典--第k个数 题目描述 有一些数的素因子只有3.5.7,请设计一个算法,找出其中的第k个数. 给定一个数int k,请返回第k个数.保证k小于等于100. 测试样例: 3 返回:7 逐个 ...

  7. C#LeetCode刷题-程序员面试金典

    本文由 比特飞 原创发布,欢迎大家踊跃转载. 转载请注明本文地址:C#LeetCode刷题-程序员面试金典 | .Net中文网. C#LEETCODE刷题概述 概述 所有LeetCode程序员面试金典 ...

  8. 《程序员面试金典》+《算法导论》

    <程序员面试金典>+<算法导论> 因为最近可能会面临一波面试,但是自己各种算法以及常见的问题的熟悉程度感觉还不够,但是由前几次的代码优化经验来看,算法优化可以说是代码优化的重中 ...

  9. 程序员面试金典——18.5单词最近的距离

    程序员面试金典--18.5单词最近的距离 Solution1:我的答案,时间复杂度为O(n2)O(n2)O(n^2). class Distance { public:int getDistance( ...

最新文章

  1. NYOJ题目1048破门锁
  2. 鸿蒙怎么运行安卓应用,华为:安卓生态应用可在部分鸿蒙设备上运行
  3. 各种各种的公共工具类
  4. python wxpython_python GUI wxPython
  5. Android Studio 3.3发布:官方支持导航编辑器
  6. vmstat记录linux状态日志到文本-随手记
  7. Modbus_TCP 报文格式解析
  8. MP3格式的音乐怎么转换成WAV格式?小编教你一招
  9. 基于easyx低配版flappybird
  10. 基于Arduino UNO的光驱写字机制作
  11. IOS下localstorage不起作用提示
  12. 理解同步和异步通信:以ROS的3中典型通信机制为例
  13. 体声波(BAW)射频滤波器行业调研报告 - 市场现状分析与发展前景预测
  14. OpenCV+ip摄像头实现远程实时监控
  15. 篮球数据API接口 - 【篮球赛事分析数据】API调用示例代码
  16. 4 int、str类型(数据类型1)、type()
  17. 小程序setData动态传递key
  18. 怎样在ipad安装ipa文件
  19. CStdioFile 一些基本用法
  20. SHP转换为SLPK

热门文章

  1. dbcp连接mysql,8小时会自动断开连接
  2. 【转载】jQuery最佳实践
  3. 网络学习(二十七)Windows XP 加入 Windows Server 2003 Active Directory
  4. 项目中除了需求外还需要知道的问题
  5. 苏州outlook的方向分析
  6. 数据中心真能促进乡村经济吗?
  7. 远程桌面连接错误:由于安全设置错误,客户端无法连接到远程计算机。
  8. SCVMM 2012 R2---安装SCVMM 2012 R2服务器
  9. find server/ -type d|xargs -I {} echo mkdir /root/{}
  10. poj-1845 Sumdiv nyoj - 928 小M的因子和