题目:

  输入两个整数序列。其中一个序列表示栈的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都不等,那么这个数生错了位置,错。

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

 #include <iostream>
#include <string> using std::string;
using std::cin;
using std::cout;
using std::endl; bool hs(const string& strSrc, const string& strJudge)
{
//先根据待比较字符串的首字母进行初始化
int pPos = strSrc.find(strJudge[]);
int pST = -, pRest = strSrc.length(); //两个游标
if (pPos > )
pST = pPos - ;
if (pPos < strSrc.length() - )
pRest = pPos + ; for (int ii = ; ii < strSrc.length() - ; ii++) //最后一个没必要管了
{
if (pST >= && strJudge[ii] == strSrc[pST]) //与栈顶的相同
pST--;
else if (pRest <= strSrc.length() - && strJudge[ii] == strSrc[pRest]) //与剩下的第一个相同
pRest++;
else
return false;
}
return true;
} int main(void)
{
string strSrc("abcde");
cout << hs(strSrc, "dceab");
cin.get();
}

(栈)栈 给定push序列,判断给定序列是否是pop序列的更多相关文章

  1. 【编程题目】栈的 push、pop 序列

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

  2. 24.栈的push和pop序列[StackPushPopSequence]

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

  3. SDUT OJ 数据结构实验之图论十:判断给定图是否存在合法拓扑序列

    数据结构实验之图论十:判断给定图是否存在合法拓扑序列 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Prob ...

  4. 栈的push、pop序列 【微软面试100题 第二十九题】

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

  5. 笔试算法题(14):整数二进制表示中的1 & 判定栈的push和pop序列是否对应

    出题:输入一个整数,要求计算此整数的二进制表示中1的个数 分析: 如果整数表示为k,当其是负数的时候,使用1<<i分别检测k的每一位:当其位整数的时候,则k/2表示将其二进制表示右移一位, ...

  6. 图结构练习——判断给定图是否存在合法拓扑序列(dfs算法(第一个代码),邻接矩阵(前两个代码),邻接表(第三个代码))

    sdut 2140 图结构练习——判断给定图是否存在合法拓扑序列 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述  给定一个有向图 ...

  7. SDUT-2140_判断给定图是否存在合法拓扑序列

    数据结构实验之图论十:判断给定图是否存在合法拓扑序列 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给定一个有向图,判 ...

  8. 面试题:栈的push和pop序列是否一致

    参数是两个数组,arr1,arr2 stack stack = new Stack() for(int i=0;j=0;i<arr1.length;i++){ stack.push(arr[i] ...

  9. 一个序列是否可能是push序列的pop序列

    输入:两个序列A.B,A作栈的push序列,判断B是否可能是A的pop序列. #include<iostream> #include<stack> using namespac ...

随机推荐

  1. LINUX HOOK

    http://blog.csdn.net/yyttiao/article/details/7346287

  2. 终端I/O之非规范模式

    关闭termios结构中c_lflag字段的ICANON标志就使终端处于非规范模式.在非规范模式中,输入数据并不组成行,不处理下列特殊字符:ERASE/KILL/EOF/NL/EOL/EOL2/CR/ ...

  3. JVM剖析

    JVM剖析 这篇文章详细解释了Java虚拟机的内部架构.以下这幅图展示了Java虚拟机里面的关键组件(是依据Java SE 7版本的Java虚拟机). 这些组件将在下面的两个章节一一展开.第一章节涵盖 ...

  4. 学了这四招,你在Linux上观看Netflix视频不发愁

    导读 一份崭新的Linux发行版已经安装到你的电脑上,你完全准备好使用免费开源办公软件处理长时间的工作.但是你可能会问自己:"难道除了工作,就没有乐趣可言?我就是想观看Netflix视频!& ...

  5. JSON使用——获取网页返回结果是Json的代码

    public String getWebData(String strUrl){ String json = null; try { URL url = new URL(strUrl); HttpUR ...

  6. Hadoop学习笔记(2) ——解读Hello World

    Hadoop学习笔记(2) ——解读Hello World 上一章中,我们把hadoop下载.安装.运行起来,最后还执行了一个Hello world程序,看到了结果.现在我们就来解读一下这个Hello ...

  7. Oracle基础<5>--触发器

    一.触发器 触发器是当特定事件出现时自动执行的代码块.比如,每次对员工表进行增删改的操作时,向日志表中添加一条记录.触发器和存储过程是由区别的:触发器是根据某些条件自动执行的,存储过程是手动条用的. ...

  8. Oracle数据库作业-3 查询

    1. 查询Student表中的所有记录的Sname.Ssex和Class列.

  9. autocomplete.js的使用(1):自动输入时,出现下拉选择框

    autocomplete.js可以实现自动输入文本值,并出现下拉框 js引用:所需要的autocomplete文件需要在网站中自行下载. <!--自动输入文本值所需的jquery文件--> ...

  10. 每天一道LeetCode--344. Reverse String

    Write a function that takes a string as input and returns the string reversed. Example:Given s = &qu ...