栈 给定push序列,判断给定序列是否是pop序列 ~ 进!出!进!出!进!出!进进出出!累死我了……

题目:

  输入两个整数序列。其中一个序列表示栈的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 }
时间: 2024-11-07 15:17:00

栈 给定push序列,判断给定序列是否是pop序列 ~ 进!出!进!出!进!出!进进出出!累死我了……的相关文章

Swift处理堆栈问题——给定两组序列,其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序

题目:输入两个整数序列.其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序.为了简单起见,我们假设push 序列的任意两个整数都是不相等的.比如输入的push 序列是1.2.3.4.5,那么4.5.3.2.1 就有可能是一个pop 系列,但序列4.3.5.1.2 就不可能是push 序列1.2.3.4.5 的pop 序列. 分析: 我们首先定义遍历push的序数i=0  遍历pop序列的序数 j =0 我们可以先遍历给出的push序列,并且时刻与pop序列的头元素p

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

图结构练习——判断给定图是否存在合法拓扑序列 Time Limit: 1000MS Memory limit: 65536K 题目描述 给定一个有向图,判断该有向图是否存在一个合法的拓扑序列. 输入 输入包含多组,每组格式如下. 第一行包含两个整数n,m,分别代表该有向图的顶点数和边数.(n<=10) 后面m行每行两个整数a b,表示从a到b有一条有向边. 输出 若给定有向图存在合法拓扑序列,则输出YES:否则输出NO. 示例输入 1 0 2 2 1 2 2 1 示例输出 YES NO #inc

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

#include<stdio.h>#include<string.h>int d[15],map[15][15],vis[15];int main(){    int i,j,k,f,n,m,u,v;    while(~scanf("%d%d",&n,&m))    {        memset(d,0,sizeof(d));        memset(map,0,sizeof(map));        memset(vis,0,size

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

29.栈的 push.pop 序列(栈)题目:输入两个整数序列.其中一个序列表示栈的 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

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

出题:输入一个整数,要求计算此整数的二进制表示中1的个数 分析: 如果整数表示为k,当其是负数的时候,使用1<<i分别检测k的每一位:当其位整数的时候,则k/2表示将其二进制表示右移一位,k%2 ==0表示其是否是偶数,如果不是则说明当前二进制表示的最右边一位为1,当k==0成立的时候移位结束: 另外还可以使用'消1'的方法,如果二进制表示A为'****1000',则A-1为'****0111',也就是我们仅关注二进制表示最右边的第一个 1,这样的话A&(A-1)的结果就可以将最右边的

第29题:判断一个序列是否是另一个push序列的pop序列

github:https://github.com/frank-cq/MyTest 第29题:输入两个整数序列,其中一个序列表示栈的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

华为机试题 二叉查搜索树 判断两序列是否为同一二叉搜索树序列

描述: 判断两序列是否为同一二叉搜索树序列 输入 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树. 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树. 输出: 如果序列相同则输出YES,否则输出NO 样例输入: 2 567432 543267 576342 0 样例输出: YES NO 本题思路:根

编写程序,判断给定的某个年份是否是闰年。

编写程序,判断给定的某个年份是否是闰年.       闰年的判断规则如下: (1)若某个年份能被4整除但不能被100整除,则是闰年.        (2)若某个年份能被400整除,则也是闰年.解答: import java.util.*; public class Bissextile{ public static void main(String[]arge){ System.out.println("please input the nian:"); int year; Scann

delphi 判断给定日期的天数,给定日期距离月初的天数,给定日期距离月末的天数

uses dateutils; //判断给定日期的天数 label1.caption := inttostr(DaysInAMonth(yearof(StrToDate(Trim(Edit_riqi.Text))),monthof(StrToDate(Trim(Edit_riqi.Text))) )); //给定日期距离月初的天数 label2.caption := inttostr(dayof(StrToDate(Trim(Edit_riqi.Text)) )-1); //给定日期距离月末的天