看到这道题,我的第一个思路是在push进栈的时候直接比较一下该数和前一个数的大小关系,直接把最小的数始终放在栈顶。可是这样的话,这个结构就不是一个栈了,因为它不能满足先进后出的原则。
答案的做法是加一个辅助栈,直接在辅助栈里村小的数,如果来小的数字就更新,如果不来小的数字就不更新。如果加一个辅助栈那这个题就简单了。
注意一个问题,这个数据栈和辅助栈是压栈一起压入,弹出的时候一起弹出。但是压入的时候,辅助栈不一定压入新的值,但一定是最小的值。因此及时在新的一轮弹出以后,这个辅助栈也始终保持数据栈中的最小元素在他的顶端。
我发现很多这种类似的题目都要建立一个辅助的数据结构一存储临时需要的结点信息,不一定非要一直想着怎么在原来的数据结构上做变化。特别是栈这种数据结构,内部的结构不好轻易变化的。
具体代码如下:
1 #include2 #include 3 #include 4 using namespace std; 5 class Solution { 6 public: 7 stack st; 8 stack aux; 9 void push(int value) {10 st.push(value);11 if (aux.size() == 0)12 {13 14 aux.push(value);15 }16 else17 {18 if (value > aux.top())//来了一个较大的值,给辅助栈放上一个值19 {20 aux.push(aux.top());21 }22 else//来的值小,放入辅助栈中23 aux.push(value);24 }25 26 }27 void pop() {28 if (st.size() == 0)29 return;30 st.pop(); //记得弹出的时候两个栈都要弹出31 aux.pop();32 }33 int top() {34 if (st.size() == 0)35 return 0;36 return st.top();37 }38 int min() {39 if (st.size() == 0)40 return 0;41 return aux.top();42 }43 };44 int main()45 {46 Solution so;47 so.push(4);48 so.push(3);49 so.push(9);50 so.push(5);51 so.push(2);52 so.push(7);53 cout << so.min() << endl;54 so.pop();55 so.pop();56 cout << so.min() << endl;57 return 0;58 }
如果加一个辅助栈,就很简单了。栈也是很常考的知识点。有一个问题,我看到很多人做这个题都用了this指针来做,但是我不明白用this指针有什么好处?
我在vs中尝试了这两句,也就是上面代码的20行,我试着调试进入这两句看看有什么不同。
1 //aux.push(value); 2 this->aux.push(value);
结果我step into进去,这两个语句的效果完全一样。而且我发现,push操作其实是调用了push_back实现的。