【Java】剑指offer(31)栈的压入、弹出序列

简介: 【Java】剑指offer(31)栈的压入、弹出序列

题目


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


思路


建立一个栈,按照压栈序列依次进行入栈操作,按出栈序列的顺序依次弹出数字。在出栈时,若下一个要出栈的数字与栈顶数字相同则弹出。如果压栈序列中的所有数字都入栈后没有完全出栈成功则代表两个序列不匹配,返回false。


测试算例 ****


1.功能测试(两个数组长度不同;两个数组对应;两个数组不对应)


2.特殊测试(数组为空;null;一个数字的数组)


Java代码


//题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是
//否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、
//5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但
//4、3、5、1、2就不可能是该压栈序列的弹出序列。
public class StackPushPopOrder {
    public boolean isPopOrder(int [] pushA,int [] popA) {
      if(pushA==null || popA==null)
      return false;
      Stack<Integer> stack = new Stack<Integer>();
      //必须提前判断长度是否相等
      if(popA.length!=pushA.length || pushA.length==0)
      return false;
      int popIndex=0;
      for(int pushIndex=0; pushIndex<pushA.length; pushIndex++) {
      stack.push(pushA[pushIndex]); 
      while(!stack.empty() &&stack.peek()==popA[popIndex]) {
        stack.pop();
        popIndex++;
      }
      }
      return stack.empty();
    }
}

收获


通过举例子,整理清楚逻辑顺序:依次先入栈,再判断是否出栈;出栈序列能实现栈的清空说明两个序列匹配。

**更多《剑指Offer》Java实现合集:https://github.com/gdutxiaoxu/Android_interview **


相关文章
|
4月前
|
存储 算法 Java
惊!Java程序员必看:JVM调优揭秘,堆溢出、栈溢出如何巧妙化解?
【8月更文挑战第29天】在Java领域,JVM是代码运行的基础,但需适当调优以发挥最佳性能。本文探讨了JVM中常见的堆溢出和栈溢出问题及其解决方法。堆溢出发生在堆空间不足时,可通过增加堆空间、优化代码及释放对象解决;栈溢出则因递归调用过深或线程过多引起,调整栈大小、优化算法和使用线程池可有效应对。通过合理配置和调优JVM,可确保Java应用稳定高效运行。
151 4
|
28天前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
54 5
|
1月前
|
存储 算法 Java
🧠Java零基础 - Java栈(Stack)详解
【10月更文挑战第17天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
44 2
|
2月前
|
存储 安全 Java
【用Java学习数据结构系列】探索栈和队列的无尽秘密
【用Java学习数据结构系列】探索栈和队列的无尽秘密
37 2
|
4月前
|
Java 索引
java中的栈(利用数组实现栈)
这篇文章通过Java代码示例介绍了如何使用数组实现栈操作,包括栈的初始化、入栈、出栈、判断栈满和空以及遍历栈的方法。
java中的栈(利用数组实现栈)
|
5月前
|
Arthas 监控 算法
JVM成神路终章:深入死磕Java虚拟机序列总纲
JVM成神路终章:深入死磕Java虚拟机序列总纲
126 1
|
5月前
|
Java 运维
开发与运维命令问题之使用jstack命令查看Java进程的线程栈如何解决
开发与运维命令问题之使用jstack命令查看Java进程的线程栈如何解决
72 2
|
5月前
|
存储 安全 Java
Java面试题:在JVM中,堆和栈有什么区别?请详细解释说明,要深入到底层知识
Java面试题:在JVM中,堆和栈有什么区别?请详细解释说明,要深入到底层知识
97 3
|
5月前
|
存储 Java 对象存储
Java虚拟机(JVM)中的栈(Stack)和堆(Heap)
在Java虚拟机(JVM)中,栈(Stack)和堆(Heap)是存储数据的两个关键区域。它们在内存管理中扮演着非常重要的角色,但各自的用途和特点有所不同。
65 0
|
5月前
|
存储 Java
JAVA程序运行问题之JVM 中的栈如何解决
JAVA程序运行问题之JVM 中的栈如何解决