• 面试金典--min栈的实现


    题目描述:实现一个包含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 }
  • 相关阅读:
    关于SQL优化(转载,格式有调整)
    开篇(我想有个家,安稳的家)
    常见兼容问题
    BFC概念及应用
    浏览器私有前缀及内核
    css3新增属性
    宽高自适应
    css布局
    css3选择器
    常用标签
  • 原文地址:https://www.cnblogs.com/cane/p/3793510.html
Copyright © 2020-2023  润新知