包含min函数的栈:最直观的想法是,使用两个栈,一个是数据栈st,一个是最小值栈minx,push函数的实现则是,直接压入数据到数据栈,如果最小值栈为空或者输入的数据小于等于最小值栈的栈顶则压入数据到最小值栈,注意,等于的也要压入,因为栈中可能包含重复的元素,比如2 3 4 2 5 6,然后三个pop操作,pop函数的实现则是,如果数据栈不为空且最小值栈不为空且数据栈栈顶和最小值栈栈顶元素相等,则从最小值栈弹出元素,否则只要数据栈不为空就弹出数据栈元素,top函数的实现则是,直接返回数据栈栈顶,min函数的实现则是,直接返回最小值栈栈顶。

stack<int> st; //存数据的栈
stack<int> minx; //存最小值的栈
void push(int value) 
{
    //直接压入数据到数据栈
    st.push(value);
    //最小值栈为空或者输入的数据小于最小值栈栈顶则压入数据到最小值栈
    //注意栈可能包含重复元素 所以小于等于的都要压入数据栈!
    if(minx.empty()||value<=minx.top())
       minx.push(value);
}
void pop() 
{
    //数据栈不为空才能弹出
    if(!st.empty())
    {
       //最小值栈不为空且数据栈栈顶等于最小值栈栈顶则弹出最小值栈
       if(!minx.empty()&&st.top()==minx.top())
          minx.pop();
       //只要数据栈不为空就弹出数据栈
       st.pop();
    }
}
int top() 
{
    return st.top();
}
int min() 
{
    return minx.top();
}