• 算法题23 带min函数的栈


    题目

      定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数。在该栈中,调用 min、push 及 pop 的时间复杂度都是 0(1)

    分析

      要在O(1)的时间获取最小元素,需要将这个最小元素保存下来。但只用一个变量去保存最小的元素可以吗?如果在使用栈的过程中将这个最小元素pop出去了,因为栈中的元素是无序的,则无法在O(1)的时间找到第二小的值做为最小元素。

     因此我们要么要将栈中的元素在push的过程中排序,要么需记录栈的每一个位置所对应的的最小值,具体做法是借助一个辅助栈,在辅助栈的同一位置上push进一个原栈从栈底至该位置的最小值。辅助栈的栈顶元素永远是最小的,每次push新元素后,

     如果新元素比辅助栈顶元素小,将该元素也push进辅助栈,反之,仍push原最小元素。过程中保持辅助栈和原栈大小一致。

    代码

     1 template <typename T>
     2 void ReverseStack(stack<T>& st);
     3 
     4 template <typename T> class minStack
     5 {
     6 public:
     7     minStack();
     8     ~minStack();
     9 
    10 public:
    11     void minpush(const T& value);
    12     void minpop();
    13     T& mintop();
    14     T& getMin();
    15 
    16 public:
    17     stack<T> st;
    18     stack<T> asis_st;
    19 };
     1 template <typename T> void minStack<T>::minpush(const T& value)
     2 {
     3     if (asis_st.empty())
     4     {
     5         st.push(value);
     6         asis_st.push(value);
     7     }else
     8     {
     9         T min=asis_st.top();
    10         asis_at.push(min<value?min:value);
    11         st.push(value);
    12     }
    13 }
    14 
    15 template <typename T> void minStack<T>::minpop()
    16 {
    17     if (!st.empty())
    18     {
    19         st.pop();
    20         asis_st.pop();
    21     }
    22 }
    23 
    24 template <typename T> T& minStack<T>::mintop()
    25 {
    26     return st.empty()?NULL:st.top();
    27 }
    28 
    29 template <typename T> T& minStack<T>::getMin()
    30 {
    31     return asis_st.empty()?NULL:asis_st.top();
    32 }
  • 相关阅读:
    消息队列中间件的技术选型分析
    数据库和缓存一致性的问题
    《RocketMQ 安装和使用》
    RocketMQ原理讲解系列文章
    阿里巴巴开源项目
    RocketMQ与Kafka对比(18项差异)
    对象初始化
    pytest_05_fixture之conftest.py
    pytest_04_测试用例setup和teardown
    Python与MogoDB交互
  • 原文地址:https://www.cnblogs.com/wangzaizhen/p/5199218.html
Copyright © 2020-2023  润新知