IMWeb提升营Day4 | 训练题21:栈的压入、弹出序列
2017-05-28 16:51
417 查看
题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路一:找规律区分
/* * 思路:出栈序列的第一个数字A可以把入栈序列分为两个部分,一部分是比A早入栈的,一部分是比A晚入栈的 * 比A早入栈的必须倒序在出栈序列中,比A晚入栈的可以递归查 */ class Solution { public: bool IsPopOrder(vector<int> pushV,vector<int> popV) { if(pushV.size() != popV.size()) return false; if(pushV.size() == 0) return true; if(pushV.size() == 1 && (pushV[0] == popV[0])) return true; if(pushV.size() == 1 && (pushV[0] != popV[0])) return false; vector<int> pushVpre; vector<int> pushVback; vector<int> popVpre; vector<int> popVback; int firstnum = popV[0]; int preflag = 0; //把入栈序列划分成两部分 for(vector<int>::iterator itt = pushV.begin(); itt != pushV.end(); itt++){ if(*itt == firstnum){ preflag = 1; }else{ if(preflag == 0){ pushVpre.push_back(*itt); }else{ pushVback.push_back(*itt); } } } //根据先入栈的必须倒叙出栈,把出栈序列中先入栈的元素删除,剩下的就是晚入栈的,注意出栈序列的第一个不算 vector<int>::iterator itt = popV.end(); itt--; for(; itt != popV.begin(); itt--){ if(*itt == pushVpre[0]){ popVpre.insert(popVpre.begin(),*itt); pushVpre.erase(pushVpre.begin()); }else{ popVback.insert(popVback.begin(),*itt); } } //把出栈元素也分成两部分后,后入栈和后出栈的元素数量不一致的话,说明顺序不对 if(pushVback.size() != popVback.size()){ return false; } //能进行到这一步,说明先入栈和先出栈的顺序没错,只需要递归对比后入栈和后出栈的顺序对不对就行了 return IsPopOrder(pushVback, popVback); } };
思路二:简洁高效的走一遍出栈入栈流程
/* * 思路二:用一个辅助栈 ,把入栈出栈流程走一遍,最后辅助栈为空说明顺序是对的 * 举例: 入栈1,2,3,4,5 出栈4,5,3,2,1 首先1入辅助栈,此时栈顶1≠4,继续入栈2 此时栈顶2≠4,继续入栈3 此时栈顶3≠4,继续入栈4 此时栈顶4=4,出栈4,弹出序列向后一位,此时为5,,辅助栈里面是1,2,3 此时栈顶3≠5,继续入栈5 此时栈顶5=5,出栈5,弹出序列向后一位,此时为3,,辅助栈里面是1,2,3 …. 依次执行,最后辅助栈为空。如果不为空说明弹出序列不是该栈的弹出顺序。 */ class Solution { public: bool IsPopOrder(vector<int> pushV,vector<int> popV) { if(pushV.size() == 0 || popV.size() == 0) return false; vector<int> stackV; for(int i = 0, j = 0; i < pushV.size(); i++){ stackV.push_back(pushV[i]); while(j < popV.size() && stackV.back() == popV[j]){ stackV.pop_back(); j++; } } if(stackV.empty()) return true; else return false; } };
相关文章推荐
- IMWeb提升营Day4 | 训练题23:二叉搜索树的后序遍历序列
- 21、栈的压入、弹出序列
- 剑指Offer——(21)栈的压入、弹出序列
- 牛客网-剑指offer-21-栈的压入、弹出序列
- IMWeb提升营Day4 | 训练题19:顺时针打印矩阵
- 【剑指offer-解题系列(21)】栈的压入、弹出序列
- 剑指offer(21)—栈的压入、弹出序列
- 剑指Offer(21)______栈的压入、弹出序列
- IMWeb提升营Day4 | 训练题24:二叉树中和为某一值的路径
- 剑指offer_21_栈的压入弹出序列
- 剑指Offer_21_栈的压入、弹出序列
- 剑指offer 21 栈的压入、弹出序列
- 栈的压入、弹出序列
- IMWeb提升营Day6 | 训练题35:数组中的逆序对
- 剑指offer---桟的压入、弹出序列
- 栈的压入、弹出序列(java版)
- 题目22:栈的压入、弹出序列
- 栈的压入、弹出序列(面试题 22)
- 栈的压入、弹出序列
- 栈的压入、弹出序列