• 包含min函数的栈


    题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。

    分析:除了题目要求的栈之外新开一个栈,用来记录最小值,每当在原栈中push数据后,与最小值栈中的栈顶元素比较,如果新值较小,则在最小值栈中push新值;否则再次push栈顶元素.pop的时候,只要将最小值栈也pop一下就行了.这样,min函数只需要返回最小值栈的栈顶元素即可.

     1 #include<stack>
     2 #include<assert.h>
     3 #include<stdio.h>
     4 #include<tchar.h>
     5 
     6 template<typename T>class  StackWithMin
     7 {
     8 public:
     9     StackWithMin(void) {}
    10     virtual ~StackWithMin(void) {}
    11 
    12     T& top(void);
    13     const T& top(void) const;
    14 
    15     void push(const T& value);
    16     void pop(void);
    17 
    18     const T& min(void) const;
    19 
    20     bool empty() const;
    21     size_t size() const;
    22 
    23 private:
    24     std::stack<T> m_data;
    25     std::stack<T> m_min;
    26 };
    27 
    28 template <typename T>void StackWithMin<T>::push(const T& value)
    29 {
    30     m_data.push(value);
    31 
    32     if(m_min.size() == 0 || value < m_min.top())
    33         m_min.push(value);
    34     else
    35         m_min.push(m_min.top());
    36 }
    37 
    38 
    39 template <typename T>void StackWithMin<T>::pop()
    40 {
    41     assert(m_data.size() > 0 && m_min.size() > 0);
    42 
    43     m_data.pop();
    44     m_min.pop();
    45 }
    46 
    47 template<typename T>const T& StackWithMin<T>::min() const
    48 {
    49     assert(m_data.size()>0 && m_min.size() >0);
    50 
    51     return m_min.top();
    52 }
    53 
    54 template<typename T>T& StackWithMin<T>::top()
    55 {
    56     return m_data.top();
    57 }
    58 template <typename T>const T& StackWithMin<T>::top() const
    59 {
    60     return m_data.top();
    61 }
    62 
    63 template <typename T> bool StackWithMin<T>::empty() const
    64 {
    65     return m_data.empty();
    66 }
    67 
    68 template<typename T> size_t StackWithMin<T>::size() const
    69 {
    70     return m_data.size();
    71 }
    72 
    73 void Test(char* testName, const StackWithMin<int>& stack, int expected)
    74 {
    75     if(testName != NULL)
    76         printf("%s begins: 
    ", testName);
    77     if(stack.min() == expected)
    78         printf("Passed.
    ");
    79     else
    80         printf("Failed.
    ");
    81 }
    82 
    83 int main()
    84 {
    85     StackWithMin<int> stack;
    86     stack.push(3);
    87     printf("min = %d
    ", stack.min());
    88     stack.push(4);
    89     printf("min = %d
    ", stack.min());
    90     stack.push(2);
    91     printf("min = %d
    ", stack.min());
    92     stack.pop();
    93     printf("min = %d
    ", stack.min());
    94     
    95     return 0;
    96 }

  • 相关阅读:
    贪吃蛇 666
    安装postgresql
    linux CentOS6.5 yum安装mysql 5.6
    centos--git搭建之Gogs安装
    查看mysql 默认端口号和修改端口号
    centos之mysql安装配置使用
    流媒体服务器SRS部署
    vue用webpack打包时引入es2015插件
    log4j2的log输出到tomcat/logs目录下及使用(转)
    log4j2的配置文件log4j2.xml笔记
  • 原文地址:https://www.cnblogs.com/sankexin/p/5619494.html
Copyright © 2020-2023  润新知