题目:最小栈

对这个类需要完成的任务有五个:

1.初始化 2.入栈 3.出栈 4.获取栈顶元素 5.获取最小值

因为初始的时候没有元素需要初始化,所以这个类的构造函数不需要去管他

通过在这个类中构建一个STL自带的stack,就可以实现234的操作,而5则需要再使用一个辅助栈,这题的难点也是在5

题目要求在常数时间内检索到最小值,所以一个一个去遍历肯定是不行的,这也是引入辅助栈的原因,我们可以通过不断地将更小的元素压入这个辅助栈(minst),来达到”栈顶的元素肯定是最小“的条件;之后如果需要取出最小元素的话,只需要对minst进行一次出栈操作即可

具体实现:

1.当有元素传入时,如果此时minst为空,就直接入栈,此后入栈的元素都是当前栈顶元素与传入元素的更小值

2.出栈操作也应该是两者同时进行的,因为最小值需要根据st的元素动态更新(假如此时st的栈顶就是最小元素,而下一步操作就是出栈,那么之后栈中的最小元素也应该发生变化)

 1class MinStack
 2{
 3public:
 4    std::stack<int> minst;
 5    std::stack<int> st;
 6
 7    MinStack()
 8    {
 9    }
10
11    void push(int val)
12    {
13        st.push(val);
14        if(minst.empty()) minst.push(val);
15        else minst.push(std::min(val, minst.top()));
16    }
17
18    void pop()
19    {
20        minst.pop();
21        st.pop();
22    }
23
24    int top()
25    {
26        return st.top();
27    }
28
29    int getMin()
30    {
31        return minst.top();
32    }
33};