首页 > 试题广场 >

栈的压入、弹出序列

[编程题]栈的压入、弹出序列
  • 热度指数:770403 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
1. 0<=pushV.length == popV.length <=1000
2. -1000<=pushV[i]<=1000
3. pushV 的所有数字均不相同
示例1

输入

[1,2,3,4,5],[4,5,3,2,1]

输出

true

说明

可以通过push(1)=>push(2)=>push(3)=>push(4)=>pop()=>push(5)=>pop()=>pop()=>pop()=>pop()
这样的顺序得到[4,5,3,2,1]这个序列,返回true      
示例2

输入

[1,2,3,4,5],[4,3,5,1,2]

输出

false

说明

由于是[1,2,3,4,5]的压入顺序,[4,3,5,1,2]的弹出顺序,要求4,3,5必须在1,2前压入,且1,2不能弹出,但是这样压入的顺序,1又不能在2之前弹出,所以无法形成的,返回false      
头像 牛客题解官
发表于 2020-06-01 10:59:58
精华题解 题目的主要信息: 给定两个序列,第一个表示入栈顺序,第二个表示出栈顺序 序列中没有重复的数字 判定第一个入栈顺序能否得到第二个出栈顺序 举一反三: 学习完本题的思路你可以解决如下题目: JZ9. 用两个栈实现队列 JZ30. 包含min函数的栈 方法一:辅助栈(推荐使用) 知识点:栈 栈是一种仅 展开全文
头像 leaves0924
发表于 2021-06-19 15:09:21
精华题解 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长 展开全文
头像 不是江小白
发表于 2021-07-07 20:49:18
精华题解 1. 解题思路:辅助栈 首先我们创建一个辅助栈stack,并初始化。然后遍历pushV,依次把元素压入该辅助栈中: 同时也比较辅助栈的栈顶元素与popV的初始元素,当发现两元素相等的时候:就停止压入,然后弹出该栈顶元素:此时辅助栈中就只有三个元素,因为pushV还有元素,所以接着添加到辅助栈中,再 展开全文
头像 Maokt
发表于 2021-06-21 14:03:24
精华题解 解题思路: (1)主要依靠辅助栈stack,将入栈pushA数据遍历添加到辅助栈stack中,定义入栈标识位index;若辅助栈非stack空且栈顶元素与出栈popA数据的index标识位相同,则辅助栈栈顶元素弹出,且index标识为 +1,若不相同,则继续将入栈pushA数据压入辅助栈,当遍 展开全文
头像 幸福的火龙果在干饭
发表于 2021-06-28 18:47:24
精华题解 一、题目描述 JZ21 栈的压入、弹出序列题目大意:给出两个序列, 一个是元素入栈的序列, 一个是元素出栈的序列, 判断按照第一个序列入栈是否可以得到给定的第二个出栈序列注意审题:这两个序列的长度是相等的, 因此不用考虑长度不相等的情况, 并且题目假设压入的所有数字都不同 二、算法(栈模拟、双指针) 展开全文
头像 Peterliang
发表于 2021-06-20 16:50:34
精华题解 题意描述 给出一个入栈序列和一个出栈序列,判断出栈序列是否属于这个入栈序列的一个合法的出栈序列。合法输出true,否则输出false.(题目保证入栈的序列中的每个数字都是不一样的) 思路分析 前置知识 首先,我们需要了解什么是栈和队列。 学习过数据结构的同学应该都知道,栈是一个先进后出的数据结构, 展开全文
头像 牛客500979850号
发表于 2021-07-16 19:42:53
精华题解 方法一:模拟栈的压入、弹出 利用一个辅助栈来模拟栈的压入和弹出。遍历popV序列,并每次判断当前是直接从栈中弹出,还是需要先压入一些序列后再弹出。代码如下 class Solution { public: bool IsPopOrder(vector<int> pushV,vect 展开全文
头像 空罐少女
发表于 2019-08-29 09:59:53
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的 展开全文
头像 一叶浮尘
发表于 2019-08-14 23:16:46
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的 展开全文
头像 ZhangHao0810
发表于 2021-07-18 15:31:25
还是遇到的少了,没能把情况考虑全面。 关于栈, 一定要考虑双向的情况,不能只push不pop,反之亦然。 public class Solution { public boolean IsPopOrder(int [] pushA,int [] popA) { Stack&l 展开全文
头像 郭家兴0624
发表于 2019-08-10 21:14:08
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度 展开全文
头像 wkkw
发表于 2022-01-15 16:30:32
这个题还是比较好理解,关键点在使用辅助栈。 题目最重要的信息是栈里的数据是唯一,这样在当前是否需要出栈的时候,可以用相等作为判断条件。 没有这个条件的化,栈里有很多相同的数,题目会很麻烦。需要回溯。 class Solution { public: &nb 展开全文
头像 中工升达预备毕业生
发表于 2019-10-08 17:37:51
栈的经典问题,判断一个序列是不是栈的弹出序列。 import java.util.Stack; public class Solution { public boolean IsPopOrder(int[] pushA, int[] popA) { Stack<Int 展开全文
头像 牛客406661200号
发表于 2021-09-27 15:18:49
使用一个栈模拟压入弹出操作 var inarr = [] var outarr = [] function IsPopOrder(pushV, popV) { // write code here for (var i=0;i<pushV.length;i++) { 展开全文
头像 练习时长的代码练习生
发表于 2022-07-17 14:56:32
基础进出栈问题 思路: 建立一个辅助栈,开始时,指针分别指向入栈数组pushV和出栈数组popV第一个元素,再让与当前出栈数组元素对应的入栈数组元素前的所有数入栈。此时栈顶元素与出栈数组元素相等,让栈顶元素出栈、出栈数组指针后移,继续判断直到不等。重复上述过程,直到入栈数组和出栈数组访问 展开全文
头像 牛客最菜男人
发表于 2020-03-15 23:37:03
没想到用栈,用了超级笨的方法,思路就是:对于每个元素,比它先入栈且后出栈的元素(们)的出栈顺序必须是它们入栈顺序的逆序举例来说: 例子1入栈序列 1 2 3 4 5出栈序列 5 4 3 1 2那么对于元素3,比它先入栈且后出栈的元素有1 2,但是其入栈顺序和出栈顺序都为 1 2,即不互为逆序所以是 展开全文
头像 橙子爱吃桃子
发表于 2020-05-10 12:37:59
C++/代码: class Solution { public: bool IsPopOrder(vector<int> pushV,vector<int> popV) { if (pushV.size() != popV.size()) return 展开全文