题目:

  输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。

  比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。因为可以有如下的push和pop序列:push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,这样得到的pop序列就是4、5、3、2、1。但序列4、3、5、1、2就不可能是push序列1、2、3、4、5的pop序列。




解法:

  当不知道怎么做时,先看看我们充满智慧的人是如何思考的。比如上面的例子,push序列叫A,pop序列叫B,找出B的第一个数字4在A中的位置,一下子就找到了(这里深深鄙视电脑没有我们的好视力),4在B中第一个表明先让1、2、3、4依次进栈,然后让4出栈,这样4就是第一个了。然后看B的第二个数5,再次用人类犀利的眼睛找到其在A中的位置,发现在4后面,没事,这表明继续把5进栈,再出栈。设想如果B的这一个不是5而是3呢?也是可以的,只要出栈顶的就行。但是设想B的这个是1呢?那么不行了,因为1已经在栈底部了,不在栈的最表面。

  从上面的分析,可以看到,我们只要确定B序列第一个数在A中的位置,从这个位置把A分成3部分,上面例子分成了123和4和5这三块,定义一个游标指向第一块的最后(如定义pST,那么它指向第一块的3),定义一个游标指向第三块的首个(如定义pRest,那么它指向第三块的5)。然后从B的第二个数开始,看它是不是和pST相等,相等说明这个数可以通过出栈得到,那么这个数出现在这个位置是没问题的;如果不等呢?那么看它与pRest是否相等,相等则表明这个数可以通过再进栈一个,然后出栈一个得到,那么这个数在这个位置也没有问题。若与pST和pRest都不等,那么这个数生错了位置,错。

  其实也就是从中心向左右两边扩散,看是不是和边界的数相等。问题就这样转化了。代码:

 1 #include <iostream>
 2 #include <string>
 3
 4 using std::string;
 5 using std::cin;
 6 using std::cout;
 7 using std::endl;
 8
 9 bool hs(const string& strSrc, const string& strJudge)
10 {
11     //先根据待比较字符串的首字母进行初始化
12     int pPos = strSrc.find(strJudge[0]);
13     int pST = -1, pRest = strSrc.length();        //两个游标
14     if (pPos > 0)
15         pST = pPos - 1;
16     if (pPos < strSrc.length() - 1)
17         pRest = pPos + 1;
18
19     for (int ii = 1; ii < strSrc.length() - 1; ii++)        //最后一个没必要管了
20     {
21         if (pST >=0 && strJudge[ii] == strSrc[pST])        //与栈顶的相同
22             pST--;
23         else if (pRest <= strSrc.length() - 1 && strJudge[ii] == strSrc[pRest])        //与剩下的第一个相同
24             pRest++;
25         else
26             return false;
27     }
28     return true;
29 }
30
31 int main(void)
32 {
33     string strSrc("abcde");
34     cout << hs(strSrc, "dceab");
35     cin.get();
36 }

转载于:https://www.cnblogs.com/jiayith/p/3932954.html

(栈)栈 给定push序列,判断给定序列是否是pop序列相关推荐

  1. 栈的push,pop序列

    题目:输入两个整数序列.其中一个序列表示栈的push 顺序, 判断另一个序列有没有可能是对应的pop 顺序. 思路:首先新建一个栈.从push序列开始遍历,如果当前元素与pop序列当前元素相等,则两个 ...

  2. 栈的push、pop序列-判断序列是否是栈的pop顺序

    程序员面试题精选100题(24)-栈的push.pop序列[数据结构] 题目:输入两个整数序列.其中一个序列表示栈的 push 顺序,判断另一个序列有没有可能是对应的 pop 顺序.为了简单起见,我们 ...

  3. 图结构练习——判断给定图是否存在合法拓扑序列

    题目描述 给定一个有向图,判断该有向图是否存在一个合法的拓扑序列. 输入 输入包含多组,每组格式如下. 第一行包含两个整数n,m,分别代表该有向图的顶点数和边数.(n<=10) 后面m行每行两个 ...

  4. 栈的push、pop序列

    题目:输入两个整数序列.其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序.为了简单起见,我们假设push序列的任意两个整数都是不相等的. 比如输入的push序列是1.2.3 ...

  5. 程序员面试题精选100题(24)-栈的push、pop序列[数据结构]

    题目:输入两个整数序列.其中一个序列表示栈的 push 顺序,判断另一个序列有没有可能是对应的 pop 顺序.为了简单起见,我们假设 push 序列的任意两个整数都是不相等的. 比如输入的push序列 ...

  6. python 正则表达式判断字符串是否为回文_JS使用栈判断给定字符串是否是回文算法示例...

    本文实例讲述了JS使用栈判断给定字符串是否是回文算法.分享给大家供大家参考,具体如下: /*使用栈stack类的实现*/ function stack() { this.dataStore = []; ...

  7. 程序员面试题精选(24):栈的push、pop序列

    题目:输入两个整数序列.其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序.为了简单起见,我们假设push序列的任意两个整数都是不相等的. 比如输入的push序列是1.2.3 ...

  8. 栈的push、pop 序列

    栈的push.pop 序列 题目:输入两个整数序列.其中一个序列表示栈的push 顺序, 判断另一个序列有没有可能是对应的pop 顺序. 为了简单起见,我们假设push 序列的任意两个整数都是不相等的 ...

  9. C语言判断给定整数序列是否构成等差数列

    C语言判断给定整数序列是否构成等差数列 题目: 判断给定整数序列能够构成等差序列. 输入说明: 有多组数据,每组输入数据由两行构成,第一行只有一个整数n(<1000),表示序列(即序列中整数的个 ...

  10. 图结构练习——判断给定图是否存在合法拓扑序列(topo)

    图结构练习--判断给定图是否存在合法拓扑序列 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description ...

最新文章

  1. sql性能分析(explain关键字)
  2. GitBash上传项目出现[fatal: remote origin already exists.]问题解决方案
  3. 【小白学习C++ 教程】二十一、C++ 中的STL容器Arrays和vector
  4. python pandas serie简介及基本使用
  5. ios UIScrollView 基础属性
  6. 写flash,要不要加个判断?
  7. PHP无限极分类巧用引用生成树
  8. Coolite Toolkit学习笔记七:常用控件TreePanel
  9. 倍福--检测和扫描ethercat从站状态
  10. 实现图片懒加载的方法
  11. python-django前端传递数据的三种格式_CBV源码分析_django模板语法
  12. wifip2p重连 android,Android Wifi实现分析
  13. 微信设置字体后微信浏览器页面字体也会跟着改变的解决办法
  14. 微分几何 Class 3 曲线,曲率与挠率
  15. springboot无法打开 jsp 页面变成下载解决办法
  16. 通过短信网关发送Wappush消息
  17. 控制输入框弹出弹窗 和不弹出窗口
  18. [python爬虫]selenium模拟登录京东招聘网,爬取研发类,数据清洗,数据存储,终数据分析和可视化
  19. BUUCTF(12_1-12_5)
  20. laravel中的fillable和guarded属性

热门文章

  1. supesite 更换目录或者域名操作方法
  2. python自动化任务_更好用的 Python 任务自动化工具:nox 官方教程
  3. 内存管理 kmalloc
  4. 深入解读Docker底层技术Cgroup
  5. Tensorflow基本语法和实现神经网络
  6. VC开发数据库基础之ADO篇
  7. opengl es3.0游戏开发学习笔记2--绘制地月星系
  8. mfsort shell语法_8.10 shell特殊符号cut命令 8.11 sort_wc_uniq命令 8.12 tee_tr_split命令 8.13 shell特殊符号下...
  9. Stamps 邮票问题 详解(C++)
  10. java axis2 开发webservice_一、Axis2 WebService开发准备工作