Day21:栈的压入、弹出序列
剑指Offer_编程题——栈的压入、弹出序列
题目描述:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能成为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列(注意:这两个序列的长度是相等的)。
具体要求:
时间限制: C/C++ 1秒,其他语言2秒 空间限制: C/C++32M,其他语言64M
具体思路:
借用一个辅助栈,遍历压栈顺序,先将第一个放入栈中,这里是1,然后判断栈顶元素是不是出栈顺序的第一个元素,这里是4,很显然1!=4,所以我们要继续压栈,直到相等以后开始出栈。出栈第一个元素,则将出栈顺序向后移动一位,直到不相等,这样循环等压栈顺序遍历完成,如果辅助栈还不为空,说明弹出序列不是该栈的弹出顺序。 为了更好的理解以上思路,举例说明: 入栈:1,2,3,4,5 出栈:4,5,3,2,1 首先1入辅助栈,此时栈顶1!=4,继续入栈2 此时栈顶2!=4,继续入栈3 此时栈顶3≠4,继续入栈4 此时栈顶4=4,出栈4,弹出序列向后移一位,此时为5,辅助栈里面是1,2,3 此时栈顶3≠5,继续入栈5 此时栈顶5=5,出栈5,弹出序列向后一位,此时为3,,辅助栈里面是1,2,3 …… 依次执行,最后辅助栈为空,如果不为空说明弹出序列不是该栈的弹出顺序。用java实现该思路。
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public boolean IsPopOrder(int [] pushA,int [] popA) {
Stack<Integer> assistant = new Stack<Integer>();
int index = 0;
for(int i = 0; i < pushA.length; i++){
assistant.push(pushA[i]);
while(!assistant.isEmpty() && assistant.peek() == popA[index]){
assistant.pop();
index += 1;
}
}
return assistant.isEmpty();
}
}
代码效果图如图所示:
用python将其实现
# -*- coding:utf-8 -*-
class Solution:
def IsPopOrder(self, pushV, popV):
# write code here
stack = []
while popV:
if pushV and pushV[0] == popV[0]:
pushV.pop(0)
popV.pop(0)
elif stack and stack[-1] == popV[0]:
stack.pop()
popV.pop(0)
elif pushV:
stack.append(pushV.pop(0))
else:
return False
return True
总结
本道题是通过定义一个栈的pop和push来判断一个序列是否为该压入栈的弹出栈。整体思路其实就是利用一个辅助栈来进行判断,并且通过入栈、出栈来实现。思路较为直接。因此,我们尽可能用多的方法以及多的用不同语言将其实现,这样才能做到多种语言的融会贯通。总之,我们要继续加油,争取早日找到工作,Good Luck!!!
参考文献
本文主要参考以下的文章: [1]: wanqian_2019 [2]: 雾行
- NO.32 不堪重负:线程池拒绝策略
- 工厂模式进阶之Android中工厂模式源码分析
- C加加游戏编程,大神十年的绝技,正确的入门,这才叫学习
- 我们应该担心吗?人工智能现在可以通过交谈来学习新单词!
- 印度财政部:比特币是纯粹投机行为 区块链资产是“庞氏骗局”
- 法律人工智能实验室成立,法官和律师会丢饭碗吗?
- 让GridView中CheckBox列支持FireFox
- 在ASP.NET MVC中通过URL路由实现对多语言的支持
- AI加持下的假肢将会越来越聪明
- 通过几个Hello World感受.NET Core全新的开发体验
- ASP.NET MVC三个重要的描述对象:ControllerDescriptor
- 基于自制数据集的MobileNet-SSD模型训练
- .NET Core采用的全新配置系统[1]: 读取配置数据
- ASP.NET MVC三个重要的描述对象:ActionDescriptor
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 前端开发:font属性与font-variant如何使用?
- spring-boot使用aop进行多数据源切换
- CRC校验原来这么简单
- centos7安装kubernetes教程
- spring-boot自定义starter
- 实操 | kafka如何手动异步提交offset
- 解惑 | 为什么我根据时间戳获得的offset为空呢?
- spring-boot使用aop进行日志记录
- openGauss备机追数Catchup过程中主库写入阻塞问题
- openGauss830版本中对于备份模块的增强与当前问题
- spring boot自动配置原理
- 网站日志分析完整实践
- 聊聊分布式下的WebSocket解决方案
- pod安装、更新库失败,github连接超时问题
- Mysql如何给字符串添加索引(前缀索引)