1.包含min函数的栈
思路:创建一个辅助栈,每次push时,辅助栈都压入当前的最小值,pop时二者共同pop,min就是返回辅助栈的栈顶。
class Solution { public: stack<int> s1,sMin; void push(int value) { s1.push(value); if(sMin.size()==0||value<sMin.top()) sMin.push(value);//有新的最小值,压入新的最小值 else sMin.push(sMin.top());//没有,压入旧的最小值 } void pop() { if(s1.size()>0&&sMin.size()>0) { s1.pop(); sMin.pop(); } } int top() { return s1.top(); } int min() { if(s1.size()>0&&sMin.size()>0) { return sMin.top(); } } };
2.栈的压入,弹出序列
思路:如果下一个弹出的数字刚好是栈顶数字,那么直接弹出;不在栈顶,就把压栈序列中还没有入栈的数字压入辅助栈,知道把下一个需要弹出的数字压入栈顶为止,如果所有数字都压入栈,仍未找到下一个弹出的数字,就返回false。
class Solution { public: bool IsPopOrder(vector<int> pushV,vector<int> popV) { /*借用一个辅助的栈,遍历压栈顺序,先将第一个放入栈中,这里是1,然后判断栈顶元素是不是出栈顺 序的第一个元素,这里是4,很显然1≠4,所以我们继续压栈,直到相等以后开始出栈,出栈一个元素, 则将出栈顺序向后移动一位,直到不相等,这样循环等压栈顺序遍历完成,如果辅助栈还不为空,说明 弹出序列不是该栈的弹出顺序*/ if(pushV.size()==0||popV.size()==0) return false; stack<int> s1; int len=pushV.size(); int i,j=0; for(i=0;i<len;i++)//压栈 { s1.push(pushV[i]); while(!s1.empty()&&s1.top()==popV[j])//若相等,出栈,后移一位,再相等就继续出栈后移,不等则压栈 { s1.pop(); j++; } } return s1.empty(); } };