设计包含min函数的栈

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

分析:这是google的一道面试题。 后来想到有个改进就是并不要最小栈和原始一样大,只有当前压入栈比之前的小,才更新,否则不需要压入;而弹出栈时,则当等于最小栈顶,最小栈才出栈。

/*
设计min函数的栈:
利用两个栈,来实现0(1)的输出最小值min
*/
#include <iostream>
using namespace std;
#include <stack>
#include <assert.h>
template <typename T> 
class CStack_Min
{
public:
    CStack_Min(){};
    ~CStack_Min(){};
public:
    void pop();
    void push(T indata);
    T min();
    T top()const;
    int stack_size();
private:
    stack<T> m_data;
    stack<T> min_data;
}; 

template <typename T> void CStack_Min<T>::push(T indata)
{
    m_data.push(indata);
    if(m_data.size()==1)
    {
        min_data.push(indata);
        return ;
    }
    if(min_data.top() > indata)
        min_data.push(indata);  //记录最小值
    else
        min_data.push(min_data.top());
}
template <typename T> T CStack_Min<T>::top()const
{
    return m_data.top();
} 

template <typename T> void CStack_Min<T>::pop()
{
    assert(m_data.size()>0);
    assert(min_data.size()>0);
    min_data.pop();
    m_data.pop();
}
template <typename T> int CStack_Min<T> ::stack_size()
{
    return m_data.size();
}
template <typename T> T CStack_Min<T> :: min()
{
    assert(m_data.size()>0);
    assert(min_data.size()>0);
    return min_data.top();
}

测试代码:

int main()
{
CStack_Min<int> min_stack;
    min_stack.push(6);
    min_stack.push(3);
    min_stack.push(4);
    min_stack.push(1);
    cout<"============\n";
    while (min_stack.stack_size()>0)
    {
        cout<<"stack_data: "<<min_stack.top()<<endl;
        cout<<"min:"<<min_stack.min()<<endl;
        min_stack.pop();
    }
}
原文地址:https://www.cnblogs.com/cheng07045406/p/3071525.html