【C/C++练习题】栈中添加min方法

举报
王建峰 发表于 2021/11/19 01:23:55 2021/11/19
【摘要】 《剑指Offer》面试题30:包含min函数的栈   1 题目 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。   2 问题分析 构造一个辅助栈,保证辅助栈空间的栈顶元素始终是数据栈中的最小元素。那么当程序对栈进行...

《剑指Offer》面试题30:包含min函数的栈

 


1 题目

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

 

2 问题分析

构造一个辅助栈,保证辅助栈空间的栈顶元素始终是数据栈中的最小元素。那么当程序对栈进行压栈or弹栈操作时,对应的辅助栈也要进行操作。

 

3 代码


      #include <stack>
      #include <assert.h>
      #include <iostream>
      //问题.实现一个包含min函数的栈
      using namespace std;
      template <typename T>
      class StackWithMin
      {
      public:
         StackWithMin() {}
         virtual ~StackWithMin() {}
         // T& top();
         // const T& top() const;
         void push(const T& value);
         void pop();
         const T& min() const;
         // bool empty() const;
         // size_t size() const;
      private:
          std::stack<T>   m_data;     // 数据栈,存放栈的所有元素
          std::stack<T>   m_min;      // 辅助栈,存放栈的最小元素
      };
      template <typename T>
      void StackWithMin<T>::push(const T& value)      //实现push方法
      {
         //1.value压入数据栈
          m_data.push(value);
         //2.将当前最小数值压入辅助栈(第一个数值,直接压入辅助栈中)
         if(m_min.size() == 0 || value < m_min.top())
              m_min.push(value);
         else
              m_min.push(m_min.top());
      }
      template <typename T>
      void StackWithMin<T>::pop()                 //实现pop方法
      {
         //1.检查栈是否为空
         assert(m_data.size() > 0 && m_min.size() > 0);
         //2.将数值弹出
          m_data.pop();
          m_min.pop();
      }
      template <typename T>
      const T& StackWithMin<T>::min() const           //实现min方法
      {
         //检查栈是否为空
         assert(m_data.size() > 0 && m_min.size() > 0);
         //返回最小数值
         return m_min.top();
      }
      int main(int argc, char* argv[])
      {
          StackWithMin<int> stack;
          stack.push(3);
          stack.push(4);
          stack.push(2);
          stack.push(3);
          cout << stack.min() << endl;
          stack.pop();
          stack.pop();
          cout << stack.min() << endl;
         return 0;
      }
  
 

 

4 运行

文章来源: blog.csdn.net,作者:hinzer,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/feit2417/article/details/99294385

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。