IMWeb提升营Day4 | 训练题21:栈的压入、弹出序列
来源:互联网 发布:淘宝升钻有什么好处 编辑:程序博客网 时间:2024/06/04 20:37
题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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; }};
阅读全文
0 0
- IMWeb提升营Day4 | 训练题21:栈的压入、弹出序列
- IMWeb提升营Day4 | 训练题23:二叉搜索树的后序遍历序列
- IMWeb提升营Day4 | 训练题20:包含min函数的栈
- IMWeb提升营Day4 | 训练题19:顺时针打印矩阵
- IMWeb提升营Day4 | 训练题24:二叉树中和为某一值的路径
- IMWeb提升营Day4
- IMWeb提升营Day4 | 训练题22:从上往下打印二叉树
- IMWeb提升营 —Day4
- IMWeb提升营Day7 | 训练题41:和为S的连续正数序列
- IMWeb提升营Day5 | 训练题27:字符串的排列
- 21、栈的压入、弹出序列
- IMWeb小白训练营DAY4任务
- 1366栈的压入弹出序列
- 栈的压入、弹出序列
- 栈的压入、弹出序列
- 栈的压入、弹出序列
- Q22:栈的压入、弹出序列
- 栈的压入弹出序列
- UESTC 1646 穷且益坚, 不坠青云之志。 差分约束、Fellman-ford
- PAT 1015 Reversible Primes(进制转换+素数)
- 乱码问题,解决办法不一定是”统一所有编码”
- Java 中的接口有什么作用?
- makefile文件的一些解读
- IMWeb提升营Day4 | 训练题21:栈的压入、弹出序列
- 【备忘】大数据Hbase视频源码解析与开发实战教程下载
- cef MasterBuildQuickStart
- Linux总结笔记5-配置虚拟主机
- 如何创建自己的网站
- 设计模式:工厂方法模式
- android 动画参考
- 多线程之CountDownLatch
- =与==