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

相关文章

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

uva 10131 最长子序列

题意: 给大象的体重和智商,求体重按从大到小,智商从高到低的最长子序列,并输出路径。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vect

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

POJ1631最长单调递增子序列

最长单调递增子序列 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokenizer;publ

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

easyui同时验证账户格式和ajax是否存在

accountName: {validator: function (value, param) {if (!/^[a-zA-Z][a-zA-Z0-9_]{3,15}$/i.test(value)) {$.fn.validatebox.defaults.rules.accountName.message = '账户名称不合法(字母开头,允许4-16字节,允许字母数字下划线)';return fal

【408DS算法题】039进阶-判断图中路径是否存在

Index 题目分析实现总结 题目 对于给定的图G,设计函数实现判断G中是否含有从start结点到stop结点的路径。 分析实现 对于图的路径的存在性判断,有两种做法:(本文的实现均基于邻接矩阵存储方式的图) 1.图的BFS BFS的思路相对比较直观——从起始结点出发进行层次遍历,遍历过程中遇到结点i就表示存在路径start->i,故只需判断每个结点i是否就是stop

linux 判断某个命令是否安装

linux 判断某个命令是否安装 if ! [ -x "$(command -v git)" ]; thenecho 'Error: git is not installed.' >&2exit 1fi

day-50 求出最长好子序列 I

思路 二维dp,dp[i][h]表示nums[i] 结尾,且有不超过 h 个下标满足条件的最长好子序列的长度(0<=h<=k),二维数组dp初始值全为1 解题过程 状态转换方程: 1.nums[i]==nums[j],dp[i,h]=Math.max(dp[i,h],dp[j,h]+1) 2.nums[i]!=nums[j],dp[i,h]=Math.max(dp[i,h],dp[j,h-1

LeetCode:3177. 求出最长好子序列 II 哈希表+动态规划实现n*k时间复杂度

3177. 求出最长好子序列 II 题目链接 题目描述 给你一个整数数组 nums 和一个非负整数k 。如果一个整数序列 seq 满足在下标范围 [0, seq.length - 2] 中 最多只有 k 个下标i满足 seq[i] != seq[i + 1] ,那么我们称这个整数序列为好序列。请你返回 nums中好子序列的最长长度。 实例1: 输入:nums = [1,2,1,1,3],