剑指offer代码解析——面试题22栈的压入、弹出序列
时间:2022-05-03
本文章向大家介绍剑指offer代码解析——面试题22栈的压入、弹出序列,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本题的详细分析过程均在代码的注释中:
import java.util.Stack;
/**
* 题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为栈的弹出顺序。
* PS:设所有数字均不想等。
* @author 大闲人柴毛毛
* @date 2016年3月15日
*/
public class StackSequence {
/**
* 栈的特点是不管入栈还是出栈,都只能对栈顶元素进行操作。
* 一个序列如果依次入栈,再依次出栈的话,序列将会被逆序输出。
* 但如果在入栈的过程中随机停止入栈操作,紧接着随机出栈n个元素,这样出栈顺序将会千变万化。
* 本题就是要求判断某一个数组是否属于指定入栈序列的出栈序列。
*/
/**
* 通过上述分析,最直观的方法就是穷举法,将一个入栈序列的所有出栈序列均罗列出来,然后判断这些序列中是否含有指定的出栈序列。
* 由于穷举法需要大量的时间、空间开销,因此要尽量避免。下面介绍更加高效的算法。
*/
/**
* 假设入栈序列为a,出栈序列为b。我们需要用一个全局变量count来记录当前匹配出栈序列的最大长度。
* 我们需要两个指针i和j分别指向序列a和b。
* 准备工作完毕,下面开始算法:
* 首先将a[i]入栈,
* 然后判断栈顶元素与b[j]是否相等,若二者相等,则该元素出栈,并count++表示已匹配到一位出栈元素,并使j++,然后重复上述操作,直到i扫描完序列a。
* 最后判断下匹配到的出栈元素个数是否与序列a的长度相同。
*/
/**
* 判断出栈序列是否符合指定入栈序列的某一种出栈顺序
* @param a 入栈序列
* @param b 出栈序列
* @return 返回执行结果
*/
public static boolean isStackSequence(int[] a,int[] b){
//若序列为空
if(a==null || b==null || a.length<=0 || b.length<=0){
System.out.println("序列为空!");
return false;
}
//若入栈序列和出栈序列长度不等
if(a.length != b.length){
System.out.println("入栈序列与出栈序列长度不等!");
return false;
}
//开始判断
{
//创建栈
Stack<Integer> stack = new Stack<Integer>();
int i=0,j=0;
while(i<a.length){
//若栈为空,则a[i]入栈
stack.add(a[i++]);
//判断栈顶元素和b[j]是否相等
if(stack.peek()==b[j]){
//栈顶元素出栈
stack.pop();
//j向后一位
j++;
}
}
//若栈中还有元素,则依次出栈,判断出栈序列与b剩余的序列是否相同
while(!stack.isEmpty()){
if(stack.pop()!=b[j])
return false;
else
j++;
}
//判断栈是否为空,若为空表示成功匹配,若不为空表示失败
if(!stack.isEmpty())
return false;
}
return true;
}
/**
* 测试
*/
public static void main(String[] args){
//入栈序列
int[] a = {1,2,3,4,5};
//出栈序列
int[] b = {4,3,5,1,2};
System.out.println(isStackSequence(a,b));
}
}
- 浅谈中国域名的名与利
- 加密货币的火爆,tokens.com域名已50万美元成交
- 家具平台谷居完成2000万元融资,启用长尾双拼域名
- 如果未来的 AI 拥有意识,你舍得不理它吗?
- 微信这家人脸智慧时尚店可以“刷脸”试衣、付款
- 北京允许无人驾驶路测 难道是为方便圣诞老人送礼?
- 小程序新增多项功能,优化100多个功能点,堪称重磅!
- 人工智能的回报率:对冲基金嵌入机器学习?
- “人工智能助力上海科创中心建设”国际高峰论坛圆满结束
- 纳米白与Pandas
- 人工智能来了!实体零售会变成什么样?
- 全国计算机等级考试重大改革!新增Python科目
- 福特:相比美国人中国人更欢迎自动驾驶未来
- Zzreal的大数据笔记-SparkDay03
- 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 数组属性和方法
- Spring Boot 2.x基础教程:使用EhCache缓存集群
- 白平衡初探
- Activity的启动过程详解(基于10.0源码)
- Activity生命周期-你真的了解吗?
- Activity启动模式
- Redis6.0主从、哨兵、集群搭建和原理
- Linux入门学习笔记二
- 聊聊dubbo-go的tracingFilter
- 轻松学Pytorch –使用torchvision实现对象检测
- Linux core dump有什么用?
- Linux系统搭建C++开发环境
- Spring入门
- TKE容器实现限制用户在多个namespace上的访问权限(上)
- TKE容器实现限制用户在多个namespace上的访问权限(下)
- 小程序Android可以请求,ios请求失败wx.request