zoukankan      html  css  js  c++  java
  • 面试题21:包含min函数的栈

    建立辅助栈,存放最小元素。当新元素比之前的最小元素小时,把新元素插入辅助栈里;否则把之前的最小元素重复插入辅助栈里

     1 // 《剑指Offer——名企面试官精讲典型编程题》代码
     2 // 著作权所有者:何海涛
     3 
     4 #pragma once
     5 
     6 #include <stack>
     7 #include <assert.h>
     8 
     9 template <typename T> class StackWithMin
    10 {
    11 public:
    12     StackWithMin(void) {}
    13     virtual ~StackWithMin(void) {}
    14 
    15     T& top(void);
    16     const T& top(void) const;
    17 
    18     void push(const T& value);
    19     void pop(void);
    20 
    21     const T& min(void) const;
    22 
    23     bool empty() const;
    24     size_t size() const;
    25 
    26 private:
    27     std::stack<T>   m_data;     // 数据栈,存放栈的所有元素
    28     std::stack<T>   m_min;      // 辅助栈,存放栈的最小元素
    29 };
    30 
    31 template <typename T> void StackWithMin<T>::push(const T& value)
    32 {
    33     // 把新元素添加到辅助栈
    34     m_data.push(value);
    35 
    36     // 当新元素比之前的最小元素小时,把新元素插入辅助栈里;
    37     //
    38     if(m_min.size() == 0 || value < m_min.top())
    39         m_min.push(value);
    40     else
    41         m_min.push(m_min.top());
    42 }
    43 
    44 template <typename T> void StackWithMin<T>::pop()
    45 {
    46     assert(m_data.size() > 0 && m_min.size() > 0);
    47 
    48     m_data.pop();
    49     m_min.pop();
    50 }
    51 
    52 
    53 template <typename T> const T& StackWithMin<T>::min() const
    54 {
    55     assert(m_data.size() > 0 && m_min.size() > 0);
    56 
    57     return m_min.top();
    58 }
    59 
    60 template <typename T> T& StackWithMin<T>::top()
    61 {
    62     return m_data.top();
    63 }
    64 
    65 template <typename T> const T& StackWithMin<T>::top() const
    66 {
    67     return m_data.top();
    68 }
    69 
    70 template <typename T> bool StackWithMin<T>::empty() const
    71 {
    72     return m_data.empty();
    73 }
    74 
    75 template <typename T> size_t StackWithMin<T>::size() const
    76 {
    77     return m_data.size();
    78 }
  • 相关阅读:
    angular入门学习文档之一
    将SDL程序变成网页(使用emscripten)
    Nim使用OpenGL
    C++移动操作,RVO和NRVO
    从零开始制作一个粒子系统
    cocos2d-x学习之路(一)——安装cocos2d-x
    堆排序
    开发zeroc ice应用入门(java开发ice应用,python开发ice应用,java与python结合开发ice服务)
    eclipse自动提示设置以及问题:去除变量自动提示(图文详解)
    ubuntu安装新版QQ
  • 原文地址:https://www.cnblogs.com/raichen/p/5648731.html
Copyright © 2011-2022 走看看