21. 包含min函数的栈

来源:互联网 发布:西瓜影音播放器mac版 编辑:程序博客网 时间:2024/06/06 13:22

题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。

解析

添加一个辅助栈,存放与数据栈中每个元素对应的当前栈中的最小值。
维护辅助栈:
1. 入栈:把新元素添加到数据栈,当新元素比之前的最小元素小时,把新元素添加到辅助栈中,否则,把之前的最小元素重复插入到辅助栈中。
2. 出栈:从数据栈弹出元素的同时,也要将辅助栈中,与该元素对应的最小值弹出辅助栈。

实现

// 《剑指Offer——名企面试官精讲典型编程题》代码// 著作权所有者:何海涛#pragma once#include <stack>#include <assert.h>template <typename T> class StackWithMin{public:    StackWithMin(void) {}    virtual ~StackWithMin(void) {}    T& top(void);    const T& top(void) const;    void push(const T& value);    void pop(void);    const T& min(void) 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){    // 把新元素添加到辅助栈    m_data.push(value);    // 当新元素比之前的最小元素小时,把新元素插入辅助栈里;    // 否则把之前的最小元素重复插入辅助栈里    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(){    assert(m_data.size() > 0 && m_min.size() > 0);    m_data.pop();    m_min.pop();}template <typename T> const T& StackWithMin<T>::min() const{    assert(m_data.size() > 0 && m_min.size() > 0);    return m_min.top();}template <typename T> T& StackWithMin<T>::top(){    return m_data.top();}template <typename T> const T& StackWithMin<T>::top() const{    return m_data.top();}template <typename T> bool StackWithMin<T>::empty() const{    return m_data.empty();}template <typename T> size_t StackWithMin<T>::size() const{    return m_data.size();}
0 0
原创粉丝点击