21栈的压入、弹出序列
1 //栈的压入、弹出序列 2 //题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。
例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,
但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) 3 4 //思路:建立一个辅助栈,把输入的第一个序列中的数字依次压入该辅助栈中,并按照第二个序列的顺序依次从该栈中弹出数字。 5 6 // *压栈序列:1、2、3、4、5 7 // *弹出序列:4、5、3、2、1 8 // *以弹出序列分析:,第一个弹出的是4,故将其压入辅助栈中; 9 // *压入栈的顺序由压栈序列确定,即把4压入辅助栈之前,必须将123入栈。此时栈里又4个数字。 10 // *把4弹出之后,然后弹出的是5。由于它没在辅助栈中的栈顶,故需要将压栈序列中的5压入辅助栈。 11 // *然后再弹出栈顶。再依次弹出321 12 // * 13 // * 规律:如果下一个弹出的数字刚好是栈顶数字,则直接弹出。 14 // * 如果下一个弹出的数字不再栈顶,把压栈序列中还没有入栈的数字压入辅助栈, 15 // * 直到下一个需要弹出的数字压入栈顶为止 16 // * 如果所有的数字都压入栈了,仍然没有找到下一个弹出的数字,那么该序列不可能是一个弹出的序列 17 18 class Solution { 19 public: 20 bool IsPopOrder(vector<int> pushV,vector<int> popV) 21 { 22 if (pushV.empty()) 23 { 24 return false; 25 } 26 vector<int> tmpVec; 27 for(int i=0, j=0; i<pushV.size();) 28 { 29 tmpVec.push_back(pushV[i++]); 30 while(j < popV.size() && tmpVec.back() == popV[j]) 31 { 32 tmpVec.pop_back(); 33 j++; 34 } 35 } 36 return tmpVec.empty(); 37 } 38 };
在代码的世界尽情的翱翔吧!