【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 代码


  
  1. #include <stack>
  2. #include <assert.h>
  3. #include <iostream>
  4. //问题.实现一个包含min函数的栈
  5. using namespace std;
  6. template <typename T>
  7. class StackWithMin
  8. {
  9. public:
  10. StackWithMin() {}
  11. virtual ~StackWithMin() {}
  12. // T& top();
  13. // const T& top() const;
  14. void push(const T& value);
  15. void pop();
  16. const T& min() const;
  17. // bool empty() const;
  18. // size_t size() const;
  19. private:
  20. std::stack<T> m_data; // 数据栈,存放栈的所有元素
  21. std::stack<T> m_min; // 辅助栈,存放栈的最小元素
  22. };
  23. template <typename T>
  24. void StackWithMin<T>::push(const T& value) //实现push方法
  25. {
  26. //1.value压入数据栈
  27. m_data.push(value);
  28. //2.将当前最小数值压入辅助栈(第一个数值,直接压入辅助栈中)
  29. if(m_min.size() == 0 || value < m_min.top())
  30. m_min.push(value);
  31. else
  32. m_min.push(m_min.top());
  33. }
  34. template <typename T>
  35. void StackWithMin<T>::pop() //实现pop方法
  36. {
  37. //1.检查栈是否为空
  38. assert(m_data.size() > 0 && m_min.size() > 0);
  39. //2.将数值弹出
  40. m_data.pop();
  41. m_min.pop();
  42. }
  43. template <typename T>
  44. const T& StackWithMin<T>::min() const //实现min方法
  45. {
  46. //检查栈是否为空
  47. assert(m_data.size() > 0 && m_min.size() > 0);
  48. //返回最小数值
  49. return m_min.top();
  50. }
  51. int main(int argc, char* argv[])
  52. {
  53. StackWithMin<int> stack;
  54. stack.push(3);
  55. stack.push(4);
  56. stack.push(2);
  57. stack.push(3);
  58. cout << stack.min() << endl;
  59. stack.pop();
  60. stack.pop();
  61. cout << stack.min() << endl;
  62. return 0;
  63. }

 

4 运行

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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