第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, pop。这样得到的pop序列就是4,5,3,2,1.但序列4,3,5,1,2就不可能是push序列1、2、3、4、5的pop序列。
代码
package test029;
import java.util.Stack;
/**
* Created by cq on 2015/6/28.
* 第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, pop。这样得到的pop序列就是4,5,3,2,1.但序列4,3,5,1,2就不可能是push序列
* 1、2、3、4、5的pop序列。
*/
public class Test029 {
public static boolean isCorrespondPopOrder(int[] pushArr, int[] popArr){
if (pushArr.length != popArr.length){
return false;
}
Stack<Integer> stack = new Stack<Integer>();
int i = 0, j = 0;
while (i < popArr.length){
//入栈
while (j < pushArr.length){
stack.push(pushArr[j]);
j++;
if (pushArr[j-1] == popArr[i]){
break;
}
}
//出栈
int top = stack.pop(); //获取栈顶元素
while (i < popArr.length){
//栈顶元素等于出栈序列当前元素,则继续出栈
if (top == popArr[i]){
i++;
if (stack.isEmpty()){ //栈已空,跳出循环
break;
}
top = stack.pop();
}
//栈顶元素不等于出栈序列当前元素。恢复栈顶元素
else {
stack.push(top);
break;
}
}
//正确情况下。入栈已经完成,那么出栈也完成,由于入栈在出栈之前
if (j == pushArr.length){
break;
}
}
return stack.isEmpty();
}
public static void main(String[] args){
int[] pushArr = {1,2,3,4,5};
int[] popArr = {4,5,3,2,1};
int[] popArr2 = {4,3,5,1,2};
System.out.println("4,5,3,2,1 是 1,2,3,4,5 的一个出栈序列:"+isCorrespondPopOrder(pushArr,popArr));
System.out.println("4,3,5,1,2 是 1,2,3,4,5 的一个出栈序列:"+isCorrespondPopOrder(pushArr,popArr2));
}
}
运行结果
Connected to the target VM, address: '127.0.0.1:25254', transport: 'socket'
Disconnected from the target VM, address: '127.0.0.1:25254', transport: 'socket'
4,5,3,2,1 是 1,2,3,4,5 的一个出栈序列:true
4,3,5,1,2 是 1,2,3,4,5 的一个出栈序列:false
Process finished with exit code 0
第29题:推断一个序列是否是还有一个push序列的pop序列的更多相关文章
- 剑指offer 面试29题
面试29题: 题目:顺时针打印矩阵(同LeetCode 螺旋矩阵打印) 题:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 ...
- 栈的push、pop序列 【微软面试100题 第二十九题】
题目要求: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1.2.3.4.5是某栈的压栈序列,序列4.5.3.2.1是该压栈 ...
- [原创] Easy SysLite V1.2 (2016.5.29更新,新增加WIN10支持,一个程序适配所有系统减肥)
[原创] Easy SysLite V1.2 (2016.5.29更新,新增加WIN10支持,一个程序适配所有系统减肥) nohacks 发表于 2016-5-29 17:12:51 https:// ...
- 据序和中序序列或者也许为了一个二进制序列,恢复二进制和打印图像(c语言)
首先要预购和序,以恢复它: 1.首先,我们使用的是递归的方式来完成 2.递归的最小单位:一个空的树和书的前言和第一序.该序列的第一个元素是树的第一序列根,调用这种方法 3.递归的终止条件是.当这棵树的 ...
- ZOJ 3963 Heap Partition set维护。给一个序列,将其划分成尽量少的序列,使每一个序列满足按照顺序构造二叉树,父母的值<=孩子的值。
Heap Partition Time Limit: Seconds Memory Limit: KB Special Judge A sequence S = {s1, s2, ..., sn} i ...
- 笔试算法题(14):整数二进制表示中的1 & 判定栈的push和pop序列是否对应
出题:输入一个整数,要求计算此整数的二进制表示中1的个数 分析: 如果整数表示为k,当其是负数的时候,使用1<<i分别检测k的每一位:当其位整数的时候,则k/2表示将其二进制表示右移一位, ...
- 刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数
今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的 ...
- 【剑指Offer面试编程题】题目1367:二叉搜索树的后序遍历序列--九度OJ
题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 输入: 每个测试案例包括2行: 第一行为1个整数 ...
- 一个序列是否可能是push序列的pop序列
输入:两个序列A.B,A作栈的push序列,判断B是否可能是A的pop序列. #include<iostream> #include<stack> using namespac ...
随机推荐
- iOS - NSLog、UncaughtException日志保存到文件
转:http://blog.csdn.net/marujunyy/article/details/12005767 对于真机,日志没法保存,不好分析问题.所以有必要将日志保存到应用的Docunment ...
- c# List<int> 转 string 以及 string [] 转 List<int>
List<int> 转 string : list<int>: 1,2,3,4,5,6,7 转换成字符串:“1,2,3,4,5,6,7” List<int> li ...
- MBR与GRUB简介
在坛子里找到一篇关于grub和mbr工作原理的文章,以前一直都是一头雾水,今天转这文章学习下..哈.. 能正常工作的grub应该包 括一下文件:stage1.stage2.*stage1_5.menu ...
- POJ 1811 Prime Test
题意:对于一个大整数,判断是否质数,如果不是质数输出最小质因子. 解法:判断质数使用Miller-Rabin测试,分解质因子使用Pollard-Rho,Miller-Rabin测试用的红书模板,将测试 ...
- [Everyday Mathematics]20150109
设 $A$ 是 $n$ 阶复方阵, 其特征多项式为 $$\bex f(\lm)=(\lm-\lm_1)^{n_1}\cdots(x-\lm_s)^{n_s}, \eex$$ 其中 $\lm_i$ 互不 ...
- Delphi richedit获取选中文字
function TForm1.GetSendText(RichEdit: TExRichEdit): string;var MsgListInfo: TStrings; i, m, n: i ...
- HDU 4630-No Pain No Game(线段树+离线处理)
题意: 给你n个数的序列a,q个询问,每个询问给l,r,求在下标i在[l,r]的区间任意两个数的最大公约数中的最大值 分析: 有了hdu3333经验,我们从左向右扫序列,如果当前数的约数在前面出现过, ...
- C ~ 一个串口接收思路
void uart_rx_isr(void) //接收中断函数 { uchar c; c=SBUF;//c等于接收的字节: switch (recv_state) { : if (c==0x02) / ...
- ACCESS TOKEN
Access Token 在微信公众平台接口开发中,Access Token占据了一个很重要的地位,相当于进入各种接口的钥匙,拿到这个钥匙才有调用其他各种特殊接口的权限. access_token是公 ...
- select XXX into 和 Insert into XXX select
检索一个表中的部分行存到另一张表中. 一 .另外的那张表没有新建的时候,使用 select XXX into,创建的表与原表有相同的列名和类型: select * into Departments_C ...