题目:

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。

例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。

思路:

直观的想法就是模拟第一个序列的数字依次入栈,并按照第二个序列依次弹出,如果第一个序列全部入栈,并最后栈中元素都被弹出来,就说明第二个序列是该栈的弹出顺序。

  • 建立一个辅助栈;
  • 将第一个序列的数字压入辅助栈;
  • 如果第二个序列的下一个弹出数字刚好是栈顶数字,则直接弹出,第二个序列弹出当前数字,辅助栈也弹出该数字;
  • 否则,就把第一个序列中尚未入栈的数字压入辅助栈,直到把第二个序列中下一个需要弹出的数字压入栈顶为止。
  • 如果第一个序列的所有数字都已经入栈了,仍然没有找到下一个弹出的数字,那么第二个序列不可能是一个弹出序列。

代码:

#include <iostream>
#include <stack>using namespace std;bool IsPopOrder(const int* push,const int* pop,int length){bool bPossible=false;if(push!=NULL && pop!=NULL && length>0){std::stack<int> stackData;int i=0;int j=0;while(j<length){while(stackData.empty() || stackData.top()!=pop[j]){if(i>length-1)break;stackData.push(push[i]);++i;}if(stackData.top()!=pop[j])break;stackData.pop();++j;}if(stackData.empty() && j==length)bPossible=true;}return bPossible;
}int main()
{int A[]={1,2,3,4,5};int B[]={4,5,3,2,1};int length=sizeof(A)/sizeof(A[0]);cout << IsPopOrder(A,B,length) << endl;return 0;
}

在线测试OJ:

http://www.nowcoder.com/books/coding-interviews/d77d11405cc7470d82554cb392585106?rp=1

AC代码:

class Solution {
public:bool IsPopOrder(vector<int> pushV,vector<int> popV) {int length=pushV.size();if(pushV.size()>0 && popV.size()>0 && pushV.size()==popV.size()){std::stack<int> stackData;int i=0;int j=0;while(j<length){while(stackData.empty() || stackData.top()!=popV[j]){if(i>length-1)break;stackData.push(pushV[i]);++i;}if(stackData.top()!=popV[j])break;stackData.pop();++j;}if(stackData.empty() && j==length)return true;}return false;}
};

转载于:https://www.cnblogs.com/AndyJee/p/4651281.html

(剑指Offer)面试题22:栈的压入、弹出序列相关推荐

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

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

  2. 剑指offer面试题[22]-栈的压入、弹出序列

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

  3. 剑指offer面试题31. 栈的压入、弹出序列(链表)

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

  4. 剑指offer(21)栈的压入、弹出序列

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

  5. 剑指offer-21.栈的压入弹出序列

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

  6. 数据结构与算法--举例分析法- 栈的压入弹出序列

    举例分析 与上两篇问中画图方法一样,我们可以用举例模拟的方法思考分析复杂问题.当一眼不能看出问题的规律的时候,我们可以用几个具体的例子来模拟一下问题的过程.这样就和我们在程序出现问题时候的debug一 ...

  7. 剑指offer(21)栈的压入、探出序列

    链接:https://www.nowcoder.com/questionTerminal/d77d11405cc7470d82554cb392585106 思路:借用一个辅助的栈,遍历压栈顺序,先将第 ...

  8. python 栈的压入弹出序列

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

  9. 剑指offer——面试题22:栈的压入、弹出序列

    剑指offer--面试题22:栈的压入.弹出序列 Solution1: 要理解并背诵此题! 参考网址: https://www.cnblogs.com/AndyJee/p/4651281.html h ...

  10. 剑指offer——面试题41:和为S的连续整数序列

    剑指offer--面试题41:和为S的连续整数序列 Solution1:我的答案 基本思路是根据等差数列的前n项和推导出首项与项数的关系,设首项为a1a1a_1,项数为kkk,和为S" ro ...

最新文章

  1. STM32F103固件库编程:关于core_cm3.c的错误
  2. Design verification经验总结
  3. python decorator ssh_Python库现后门 可窃取用户SSH信息
  4. android 6.0 logcat机制(三)logd处理请求log
  5. HBuilder、HBuilderX连接夜神模拟器
  6. 数据结构上机测试2-1:单链表操作A
  7. Ansible系列--Copy模块
  8. mysql的varchar与text对比
  9. 利用 Commons-Fileupload 实现文件上传分析(转)
  10. Lasso估计学习笔记(二)
  11. 完美的迅捷PDF在线转换软件
  12. android 界面 edittext详解,Android 开发之EditText属性详解
  13. 富士通Fujitsu DPK750 Pro 打印机驱动
  14. 服务器共享文件夹设置特殊权限,资料共享服务器权限设置、服务器共享盘设置权限、设置局域网共享文件夹访问权限的方法...
  15. 详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS
  16. 淘宝快捷回复短语大全
  17. dev c++缺省源
  18. 硬盘分区,格式化分区,删除分区
  19. 30分钟LINQ教程(转)
  20. MATLAB实战——方差分析

热门文章

  1. Python踩坑:类与类对象类型参数传递与使用
  2. Spring 基于xml配置方式的AOP
  3. 如何在网页中禁止使用鼠标右键?几种方法和大家分享
  4. 邮件系列(二)-发送邮件
  5. android第一天
  6. Linux基础命令---su
  7. PHP把下划线分隔命名的字符串 转换成驼峰式命名方式
  8. 洛谷1373 小a和uim之大逃离
  9. 希捷发布世界最薄、最快2TB硬盘:7毫米
  10. 0基础搭建Hadoop大数据处理-初识