zoukankan      html  css  js  c++  java
  • 栈 · 有getMin功能的栈O(1)

    题面

    实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中的最小元素的操作。

    要求

    pop(), push(), getMin()时间复杂度都是O(1)

    思路

    1.准备两个栈,数据栈+最小元素栈
    2.压入元素时,先压入数据栈,然后与最小元素栈顶比较;若小,则压入,若大,不做处理(1)/压入当前栈顶(2)
    (1)若不做处理,那么需要在pop()弹出时,做判断,若stackData要弹出的元素与stackMin顶相等,那么将stackMin顶也一并弹出
    (2)若2中采用再次压入stackMin顶元素,那么在pop()函数中,就只要弹出两个栈顶即可,逻辑较为简单。

    实现 (代码未测试,注意!)

    【1】占用额外空间较小,但pop(),push()函数较为复杂

     1 class MyStack_1 {
     2 private:
     3     stack<int> stackData;//数据栈
     4     stack<int> stackMin;//最小元素栈
     5 public:
     6     void push(int num)
     7     {
     8         stackData.push(num);
     9         if (stackMin.empty())//为空,直接压入
    10             stackMin.push(num);
    11         else
    12         {
    13             if (num < stackMin.top())
    14                 stackMin.push(num);
    15         }
    16     }
    17     int pop()
    18     {
    19         if (!stackData.empty())//数据栈非空
    20         {
    21             int top = stackData.top();
    22             stackData.pop();
    23             if (top == stackMin.top())
    24                 stackMin.pop();
    25             return top;
    26         }
    27     }
    28     int getMin()
    29     {
    30         return stackMin.top();
    31     }
    32     int top()
    33     {
    34         return stackData.top();
    35     }
    36 };

    【2】占用额外空间较大,操作函数简单。

     1 class MyStack_2 {
     2 private:
     3     stack<int> stackData;//数据栈
     4     stack<int> stackMin;//最小元素栈
     5 public:
     6     void push(int num)
     7     {
     8         stackData.push(num);
     9         if (stackMin.empty())//为空,直接压入
    10             stackMin.push(num);
    11         else
    12         {
    13             if (num < stackMin.top())//小,压入它
    14                 stackMin.push(num);
    15             else//大,压入当前栈顶
    16                 stackMin.push(stackMin.top());
    17         }
    18     }
    19     int pop()
    20     {
    21         if (!stackData.empty())//数据栈非空
    22         {
    23             int top = stackData.top();
    24             stackData.pop();
    25             stackMin.pop();
    26             return top;
    27         }
    28     }
    29     int getMin()
    30     {
    31         return stackMin.top();
    32     }
    33     int top()
    34     {
    35         return stackData.top();
    36     }
    37 };
  • 相关阅读:
    abs() 与fabs() 的区别辨析
    TCP服务端如何判断客户端断开连接学习
    数据结构与算法李春葆 第二章思维导图
    数据结构与算法思维导图第一章
    关于临时表的操作
    关于 ANSI_NULLS和QUOTED_IDENTIFIER
    临时表和视图的区别
    关于CancellationToken的解释
    在项目中添加signalr.js
    数据库存储过程的写法
  • 原文地址:https://www.cnblogs.com/yocichen/p/10819677.html
Copyright © 2011-2022 走看看