题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该栈序列的弹出序列。

思路:如果下一个弹出的数字刚好是栈顶数字,那么直接弹出。如果下一个弹出的数字不在栈顶,我们把压栈序列中还没有入栈的数字压入辅助栈,直到把下一个需要弹出的数字压入栈顶为止。如果所有的数字,那么该序列不可能是一个弹出序列。
 
测试用例:
1)功能测试(输入的两个数组含有多个数字或者只有1个数字,第二个数组是或者不是第一个数组表示的压入序列对应的栈的弹出序列);
2)特殊输入测试(输入两个null指针)。
 
代码实现:
package com.yyq;

import java.util.Stack;

/**
* Created by Administrator on 2015/9/16.
*/
public class StackPushPopOrder {
public static boolean isPopOrder(int[] pPush, int[] pPop){
boolean bPossible = false;
if (pPop == null || pPush == null)
return bPossible;
int pslen = pPush.length;
int polen = pPop.length;
int i = 0;
int j = 0;
Stack<Integer> stackData = new Stack<>();
if (pPush != null && pPop != null && pslen == polen && pslen > 0){
while(i < polen){
while ((stackData.empty() || stackData.peek() != pPop[i]) && j < pslen){ //如果存在相同的数据那又怎么处理呢?
stackData.push(pPush[j]);
j++;
}
if (stackData.peek() != pPop[i])
break;
stackData.pop();
i++;
}
if (stackData.empty() && i == polen)
bPossible = true;
}
return bPossible;
} // ====================测试代码====================
public static void Test(String testName, int[] pPush, int[] pPop, boolean expected)
{
if(testName != null)
System.out.println(testName+" begins: ");
if(isPopOrder(pPush, pPop) == expected)
System.out.println("Passed.");
else
System.out.println("failed.");
System.out.println();
} public static void Test1()
{
int push[] = {1, 2, 3, 4, 5};
int pop[] = {4, 5, 3, 2, 1};
Test("Test1", push, pop, true);
} public static void Test2()
{
int push[] = {1, 2, 3, 4, 5};
int pop[] = {3, 5, 4, 2, 1};
Test("Test2", push, pop, true);
} public static void Test3()
{
int push[] = {1, 2, 3, 4, 5};
int pop[] = {4, 3, 5, 1, 2};
Test("Test3", push, pop, false);
} public static void Test4()
{
int push[] = {1, 2, 3, 4, 5};
int pop[] = {3, 5, 4, 1, 2}; Test("Test4", push, pop, false);
} // push和pop序列只有一个数字
public static void Test5()
{
int push[] = {1};
int pop[] = {2}; Test("Test5", push, pop, false);
} public static void Test6()
{
int push[] = {1};
int pop[] = {1}; Test("Test6", push, pop,true);
} public static void Test7()
{
Test("Test7", null, null, false);
} public static void main(String[] args){
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
Test7();
}
}
 
结果输出:
Test1 begins: 
Passed.
 
Test2 begins: 
Passed.
 
Test3 begins: 
Passed.
 
Test4 begins: 
Passed.
 
Test5 begins: 
Passed.
 
Test6 begins: 
Passed.
 
Test7 begins: 
Passed.

P134、面试题22:栈的压入、弹出序列的更多相关文章

  1. 剑指offer-面试题22.栈的压入,弹出序列

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

  2. 【剑指offer】栈的压入弹出序列,C++实现(举例)

    原创文章,转载请注明出处! 本题牛客网地址 博客文章索引地址 博客文章中代码的github地址 1.题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为第一个序列的出栈序列.注意 ...

  3. 剑指offer - 栈的压入弹出序列 - JavaScript

    题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列 1,2,3,4,5 是某栈的压入顺序,序列 4,5,3,2,1 ...

  4. 剑指Offer20 栈的压入弹出序列是否正确

    /************************************************************************* > File Name: 20_IsPopO ...

  5. 剑指Offer:面试题22——栈的压入,弹出序列(java实现)

    题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈 ...

  6. 剑指 offer面试题22 栈的压入和弹出序列

    题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序 ...

  7. 剑指offer-栈的压入弹出序列21

    题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压 ...

  8. 《剑指offer》面试题22—栈的压入、弹出序列

    <程序员面试宝典>上也有经典的火车进站问题,类似. 如果12345是压栈顺序,序列45321可能是出栈顺序,但序列43512不可能. 规律:对序列中任意元素n,排在n后且比n小的元素一定是 ...

  9. 《剑指offer》面试题22 栈的压入、弹出序列 Java版

    (输入两个整数序列,第一个序列是一串数字的压入顺序,判断第二个序列是否是该栈数字的弹出顺序.) 我的方法:压入序列是给定的,每一次弹出操作形成一个弹出序列的值,我们从前往后遍历弹出序列,每一次访问弹出 ...

  10. 剑指offer-面试题31-栈的压入弹出序列-栈

    #include<iostream> #include<string.h> #include<algorithm> #include<cmath> #i ...

随机推荐

  1. C++与Lua交互(四)

    引言 通过前几篇,我们已经对Lua的C API有了一定的了解,如lua_push*.lua_is*.lua_to*等等.用C++调用Lua数据时,我们主要运用lua_getglobal与lua_pus ...

  2. MFC中获取指针的方法

    1.获取应用程序指针 CMyApp* pApp=(CMyApp*)AfxGetApp(); 2.获取主框架指针 CWinApp 中的公有成员变量 m_pMainWnd 就是主框架的指针 CMainFr ...

  3. L008-oldboy-mysql-dba-lesson08

    L008-oldboy-mysql-dba-lesson08 xtrabackup安装 [root@web01 installer]# wget https://www.percona.com/dow ...

  4. WMB代理无法正常启动时的解决方案。

     情况:执行了启动命令,查看状态的时候 还是停止..再启动,又说已经启动了..   解决方案:正常情况在hosts文件加一条记录:主机IP和hostname的映射关系就好了

  5. netty启动过程

    netty先启动work线程,work线程打开selector 绑定pipeline 启动boss线程,绑定端口,注册selector,绑定op_accetp事件 ------------------ ...

  6. PHP随机生成广告图片的实例 代码

    PHP随机生成广告图片: <?php /*  +------------------------------------------------------------------+  | Mi ...

  7. STM8S003K3用Tim1的通道4输出20KHz的PWM波

    void Init_pwm(){TIM1_DeInit(); TIM1_TimeBaseInit(0, TIM1_COUNTERMODE_UP, 800, 0x00);//250 TIM1_OC4In ...

  8. hdu 4622 Reincarnation 字符串hash 模板题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4622 题意:给定一个长度不超过2000的字符串,之后有不超过1e5次的区间查询,输出每次查询区间中不同 ...

  9. 【转】perl 变量 $/ 的用法解析 上下文为行模式时,$/ 定义以什么来区分行

    默认状态下,很显然都是用\n来区分行,\n也被我们称作为换行符. 当读取序列时,按行来读取时,就是以换行符为标准. 读取的strawberry1.gb的文件内容如下: LOCUS JX118024 4 ...

  10. SQL*Loader使用详解(一)

    1.SQL*Loader介绍 1)SQL*Loader是一个从外部文件指加载数据到Oracle数据库的工具.语法类似于DB2的Load语法,但SQL*Loader支持各种load格式.选择性load和 ...