(栈)栈 给定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都不等,那么这个数生错了位置,错。
其实也就是从中心向左右两边扩散,看是不是和边界的数相等。问题就这样转化了。代码:
#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序列的更多相关文章
- 【编程题目】栈的 push、pop 序列
29.栈的 push.pop 序列(栈)题目:输入两个整数序列.其中一个序列表示栈的 push 顺序,判断另一个序列有没有可能是对应的 pop 顺序.为了简单起见,我们假设 push 序列的任意两个整 ...
- 24.栈的push和pop序列[StackPushPopSequence]
[题目] 输入两个整数序列.其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序.为了简单起见,我们假设push序列的任意两个整数都是不相等的. 比如输入的push序列是1.2 ...
- SDUT OJ 数据结构实验之图论十:判断给定图是否存在合法拓扑序列
数据结构实验之图论十:判断给定图是否存在合法拓扑序列 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Prob ...
- 栈的push、pop序列 【微软面试100题 第二十九题】
题目要求: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1.2.3.4.5是某栈的压栈序列,序列4.5.3.2.1是该压栈 ...
- 笔试算法题(14):整数二进制表示中的1 & 判定栈的push和pop序列是否对应
出题:输入一个整数,要求计算此整数的二进制表示中1的个数 分析: 如果整数表示为k,当其是负数的时候,使用1<<i分别检测k的每一位:当其位整数的时候,则k/2表示将其二进制表示右移一位, ...
- 图结构练习——判断给定图是否存在合法拓扑序列(dfs算法(第一个代码),邻接矩阵(前两个代码),邻接表(第三个代码))
sdut 2140 图结构练习——判断给定图是否存在合法拓扑序列 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 给定一个有向图 ...
- SDUT-2140_判断给定图是否存在合法拓扑序列
数据结构实验之图论十:判断给定图是否存在合法拓扑序列 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给定一个有向图,判 ...
- 面试题:栈的push和pop序列是否一致
参数是两个数组,arr1,arr2 stack stack = new Stack() for(int i=0;j=0;i<arr1.length;i++){ stack.push(arr[i] ...
- 一个序列是否可能是push序列的pop序列
输入:两个序列A.B,A作栈的push序列,判断B是否可能是A的pop序列. #include<iostream> #include<stack> using namespac ...
随机推荐
- io cache
http://blog.163.com/digoal@126/blog/static/163877040201571511020418 http://dirlt.com/
- Game: Map Design Considerations 游戏地图设计指南
依据前文伏击战场景手稿, 用Tile Studio "草草"制作出该场景的地图: 生成的C源码: #ifndef _open_war_1Gfx_c #define _open_wa ...
- 代码片段 - Golang 实现简单的 Web 服务器
------------------------------ 下面一段代码,实现了最简单的 Web 服务器: 编译环境: Linux Mint 18 Cinnamon 64-bit Golang 1. ...
- WinServer 之 访问同网段服务器 或 同一服务器多虚拟机间的访问
今天在发布网站时遇到不能访问同网段数据库服务器.具体情况为:web服务端部署在192.168.10.1下,而数据库服务端部署在192.168.10.2下,数据库连接直接配置为192.168.10.2会 ...
- 在使用ICSharpCode.SharpZipLib进行目录压缩后,再解压缩是提示这个错误Size mismatch: 4294967295;126976 70202;126976
在压缩代码中加入entry.CompressionMethod = CompressionMethod.Stored
- 自定义带有uitableview的alertview对话框
#import <UIKit/UIKit.h> typedef void(^MyCompleteHandler) (NSString *selectString); @interface ...
- 基于 SOA 的组件化业务基础平台
业务基础平台是业务逻辑应用和基础架构平台之间的一个中间层,解决 “应用软件的业务描述和操作系统平台.软件基础架构平台之间的交互与管理问题”.操作系统平台解决了“应用软件系统与硬件之间的交互与管理问题” ...
- [Java] webservice soap,wsdl 例子
java 调用webservice的各种方法总结 现在webservice加xml技术已经逐渐成熟,但要真正要用起来还需时日!! 由于毕业设计缘故,我看了很多关于webservice方面的知识,今天和 ...
- 【python,logging】python中的logging模块
本文章转自kenby的博客,比较全面易懂,转来留作以后使用. http://kenby.iteye.com/blog/1162698 一.从一个使用场景开始 import logging # 创建一个 ...
- poj 2152 树形DP
思路:这个没思路,看了陈启峰的论文写得. #include<map> #include<set> #include<cmath> #include<queue ...