13 给定的出栈序列是否满足入栈序列

2024-05-28 15:48

本文主要是介绍13 给定的出栈序列是否满足入栈序列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

本博文部分图片, 思路来自于剑指offer 或者编程珠玑

问题描述

这里写图片描述

思路

对于这个问题, 书中给出了一种解法

思路 : 依照给定的序列模拟进行压栈, 出栈操作, 判断是否能够形成给定的出栈序列, 详细思路请见 “剑指offer”, 或者下面的代码的注释

参考代码

/*** file name : Test06StackPushPopOrder.java* created at : 2:15:32 PM Jun 7, 2015* created by 970655147*/package com.hx.test05;public class Test06StackPushPopOrder {// 给定一个入栈顺序  判定是否能形成制定的出栈序列public static void main(String []args) {int[] pushSeq = new int[] {1, 2, 3, 4, 5 };
//      int[] popSeq = new int[] {1, 2, 3, 4, 5 };int[] popSeq = new int[] {1, 3, 2, 5, 4 };
//      int[] popSeq = new int[] {5, 4, 3, 2, 1 };isStatisfiyPushPopOrder(pushSeq, popSeq);}// 思路 : 先判断Stack顶部的元素是否是下一个popSeq中的元素[top]   如果是, 则直接从stack中pop该元素// 否则  将pushSeq中的元素 压入Stack中, 直到新的栈顶元素为top 或者push了pushSeq中所有的元素// 现在 判定Stack的顶部元素是否是top   如果是, pop顶部元素, 进入下一个循环, 判定下一个popSeq的元素// 否则 则说明添加了所有的pushSeq中的元素 也没有找到一个和top相同的元素    表示不可能形成此输出序列  返回falsepublic static void isStatisfiyPushPopOrder(int[] pushSeq, int[] popSeq) {Deque<Integer> stack = new LinkedList<Integer>();boolean isLeagel = true;int pushIdx = 0, popIdx = 0;        while(popIdx < popSeq.length) {int top = popSeq[popIdx ++];if((stack.size() > 0) && (top == stack.getFirst()) ) {stack.pop();} else {for(; pushIdx < pushSeq.length; pushIdx ++) {stack.push(pushSeq[pushIdx]);if(pushSeq[pushIdx] == top) {break;}}if(top == stack.getFirst()) {stack.pop();} else {
//                  Log.log(false);isLeagel = false;break ;}}}Log.log(isLeagel);}}

效果截图

这里写图片描述

总结

思路应该是不难, 时间复杂度为线性时间复杂度

注 : 因为作者的水平有限,必然可能出现一些bug, 所以请大家指出!

这篇关于13 给定的出栈序列是否满足入栈序列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1011004

相关文章

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

利用Python实现时间序列动量策略

《利用Python实现时间序列动量策略》时间序列动量策略作为量化交易领域中最为持久且被深入研究的策略类型之一,其核心理念相对简明:对于显示上升趋势的资产建立多头头寸,对于呈现下降趋势的资产建立空头头寸... 目录引言传统策略面临的风险管理挑战波动率调整机制:实现风险标准化策略实施的技术细节波动率调整的战略价

Python如何判断字符串中是否包含特殊字符并替换

《Python如何判断字符串中是否包含特殊字符并替换》这篇文章主要为大家详细介绍了如何使用Python实现判断字符串中是否包含特殊字符并使用空字符串替换掉,文中的示例代码讲解详细,感兴趣的小伙伴可以了... 目录python判断字符串中是否包含特殊字符方法一:使用正则表达式方法二:手动检查特定字符Pytho

PostgreSQL 序列(Sequence) 与 Oracle 序列对比差异分析

《PostgreSQL序列(Sequence)与Oracle序列对比差异分析》PostgreSQL和Oracle都提供了序列(Sequence)功能,但在实现细节和使用方式上存在一些重要差异,... 目录PostgreSQL 序列(Sequence) 与 oracle 序列对比一 基本语法对比1.1 创建序

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动