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

相关文章

检查 Nginx 是否启动的几种方法

《检查Nginx是否启动的几种方法》本文主要介绍了检查Nginx是否启动的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1. 使用 systemctl 命令(推荐)2. 使用 service 命令3. 检查进程是否存在4

java中判断json key是否存在的几种方法

《java中判断jsonkey是否存在的几种方法》在使用Java处理JSON数据时,如何判断某一个key是否存在?本文就来介绍三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目http://www.chinasem.cn录第一种方法是使用 jsONObject 的 has 方法

MySQL使用EXISTS检查记录是否存在的详细过程

《MySQL使用EXISTS检查记录是否存在的详细过程》EXISTS是SQL中用于检查子查询是否返回至少一条记录的运算符,它通常用于测试是否存在满足特定条件的记录,从而在主查询中进行相应操作,本文给大... 目录基本语法示例数据库和表结构1. 使用 EXISTS 在 SELECT 语句中2. 使用 EXIS

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

Linux实现查看某一端口是否开放

《Linux实现查看某一端口是否开放》文章介绍了三种检查端口6379是否开放的方法:通过lsof查看进程占用,用netstat区分TCP/UDP监听状态,以及用telnet测试远程连接可达性... 目录1、使用lsof 命令来查看端口是否开放2、使用netstat 命令来查看端口是否开放3、使用telnet

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp