输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

思路:对于出栈的每一个元素,在它前面入栈的元素,要么已经被弹出(在出栈序列中位于该元素前方),要么未被弹出且之后会被弹出(在出栈序列中位于该元素后方)。4,5,3,2,1 满足但是4,3,5,1,2不满足的区别是,前一个弹出序列,3出现的时候,2和1都未曾出现,那2和1一定会按照     2 -> 1    的顺序(入栈的反向顺序)出现; 而第二个序列中1出现在了2的前面,所以不可能是弹出序列。

考虑每一个出栈元素(比如3),在入栈序列中的位置,以及入栈序列中在它之前的元素/在出栈序列中出现的顺序。 入栈序列中在它之前的元素,要么出栈在它之前,要么在它之后(比如出栈序列2,3,1,4,5, 2在3前面但1在3后边),在它之后出现的/所有入栈序列前端元素/一定满足的条件是/元素在入栈序列位置越靠前,在出栈序列中位置会越靠后(反向)。

class Solution {
public:bool IsPopOrder(vector<int> pushV,vector<int> popV) {if(pushV.empty()) return true;if(pushV.size() != popV.size()) return false;typedef vector<int>::iterator iterator;for(iterator val_in_pop = popV.begin(); val_in_pop != popV.end(); val_in_pop++){iterator current_object = val_in_pop;       // 对每个出栈序列的元素,在入栈序列中找到其位置iterator val_in_push = find(pushV.begin(), pushV.end(), *val_in_pop);       // 如果两个vector不包含同一个元素,那不可能是同一组数if(val_in_push == pushV.end())return false;// 入栈序列之前有多少元素,在弹出序列中的位置大小就要比较多少次, 比如 4,5,3,2,1,对4来说, 入栈序列前面有1,2,3,就要比较三次for(int i = val_in_push - pushV.begin(); i > 0; i--){          // 每次前移一个元素,相邻两个元素比较iterator former_in_push = val_in_push - 1;          // 入栈序列前一个元素在出栈序列的位置iterator former_in_pop = find(val_in_pop, popV.end(), *former_in_push);          // 找不到就过,因为可能之前已经弹出去了;找到了就要满足反向的顺序;不满足位置关系就是错误的if(former_in_pop != popV.end()){if(former_in_pop - current_object > 0)current_object = former_in_pop;elsereturn false;}val_in_push--;}}return true;}
};

转载于:https://www.cnblogs.com/heifengli/p/11252848.html

剑指offer(21):栈的压入、弹出序列相关推荐

  1. 【LeetCode】剑指 Offer 31. 栈的压入、弹出序列

    [LeetCode]剑指 Offer 31. 栈的压入.弹出序列 文章目录 [LeetCode]剑指 Offer 31. 栈的压入.弹出序列 package offer;import java.uti ...

  2. 【剑指offer-Java版】22栈的压入弹出序列

    栈的压入弹出序列:给定两个序列,一个是压入顺序,判断另外一个是否是该压入顺序的一个弹出顺序 思路:纯粹的模拟栈的压入和弹出顺序 分别遍历压栈序列seq1和另一个序列seq2 比较当前栈顶元素和seq2 ...

  3. 剑指Offer 31 栈的压入、弹出序列

    栈的压入.弹出序列 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2 ...

  4. 剑指Offer之栈的压入、弹出序列

    题目描述 输入两个整数序列,第一个序列表示栈的压入书序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相同.例如1.2.3.4.5是某栈的压入序列,序列5.4.3.2.1是该栈对应的一 ...

  5. 剑指offer:栈的压入、弹出序列

    题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压 ...

  6. 剑指OFFER之栈的压入、弹出序列(九度OJ1366)

    题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈 ...

  7. 《剑指offer》-- 栈的压入与弹出序列、把字符串转化为整数、扑克牌顺子、孩子们的游戏(圆圈中最后剩下的数)

    一.栈的压入与弹出序列: 1.题目: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序. 假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序 ...

  8. 《剑指offer》栈的压入、弹出序列

    题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对 ...

  9. java输出栈的弹出序列_剑指offer:栈的压入、弹出序列(Java)

    1.题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是 ...

最新文章

  1. 先验概率,后验概率,条件概率,贝叶斯
  2. 【Android 逆向】IDA 工具使用 ( 交叉引用数量设置 | 调试设置 )
  3. 数据结构: 线索化二叉树
  4. DM8168学习--内存烧写位置
  5. mysql check table_修复MySQL的MyISAM表命令check table用法
  6. 【NC51 合并k个已排序的链表】K路归并
  7. Python time strftime() 方法
  8. ios上传图片文件到服务器,iOS 图片以文件形式上传到服务器
  9. Servlet乱码解决
  10. axure源文件_Axure函数应用:指示线跟随地图所选区域,并展示相应数据可视化...
  11. 谈谈公司内部的技术分享
  12. bind服务12---分离解析
  13. google浏览器网页背景颜色修改
  14. 计算机多功能图像分析,计算机辅助图像分析
  15. git入职第一天快速使用指南
  16. 手把手教你用Arcgis绘制地图【热力图】
  17. 服务器进系统后键盘鼠标一卡一卡的,windows10系统鼠标卡顿的处理方法
  18. LeetCode–剪绳子
  19. 这几个Python数据可视化探索实例,拿走不谢!
  20. 面试题------Spring中Bean的初始化以及销毁init-method、destory-method

热门文章

  1. 全实践!3天物联网安全课程不断电
  2. 维他奶订单数据处理准确率100%背后的秘密
  3. 世界人工智能发展究竟到了什么水平 ?
  4. 谈谈战双的战斗机制设计趋同
  5. SDN 作业提示器(持续更新)
  6. Toad for Oracle工具的使用(二)
  7. 运维无小事,小事不运维
  8. Django日志模块配置
  9. 命名空间“Microsoft.Office”中不存在类型或命名空间名称“Interop”(是否缺少程序集引用?...
  10. jar 命令 打包装class文件的文件夹