剑指offer打卡Day18: 栈的压入、弹出序列
题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
示例
输入
[1,2,3,4,5],[4,3,5,1,2]
返回值
false
解析:
栈是非常基础的一种数据结构,不过在
铲屎工作中用的不多,特地复习下,Crtl+ 点击源码,好家伙,一上来就是public class Stack<E> extends Vector<E>
,那只能从Vector开始看起
-
Vector
-
Vector
原意:矢量、向量,因此一般称作矢量队列,查看其源码public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
可得:
- 继承了AbstractList,实现了List,所以,它是一个队列,支持相关的添加、删除、修改、遍历等功能
- 实现了RandmoAccess接口,即提供了随机访问功能。
- RandmoAccess是java中用来被List实现,为List提供快速访问功能的。
- 在Vector中,我们即可以通过元素的序号快速获取元素对象;这就是快速随机访问。
- 实现了Cloneable接口,即实现clone()函数。它能被克隆。
- 同是list,但ArrayList不同,可由代码中的synchronized 得知 Vector中的操作是线程安全的
-
Vector 继承关系:
java.lang.Object ↳ java.util.AbstractCollection<E> ↳ java.util.AbstractList<E> ↳ java.util.Vector<E>
Vector的数据结构和ArrayList差不多,它包含了3个成员变量:elementData , elementCount, capacityIncrement。
- elementData 是"Object[]类型的数组",它保存了添加到Vector中的元素。elementData是个动态数组,如果初始化Vector时,没指定动态数组的>大小,则使用默认大小10。随着Vector中元素的增加,Vector的容量也会动态增长,capacityIncrement是与容量增长相关的增长系数,具体的增长方式,请参考源码分析中的ensureCapacity()函数。
- elementCount 是动态数组的实际大小。
- capacityIncrement 是动态数组的增长系数。如果在创建Vector时,指定了capacityIncrement的大小;则,每次当Vector中动态数组容量增加时>,增加的大小都是capacityIncrement。
-
Vector的构造函数
// 默认构造函数,创建一个默认的向量,默认大小为 10; public Vector() // capacity是Vector的默认容量大小。当由于增加数据导致容量增加时,每次容量会增加一倍。 public Vector(int capacity) // capacity是Vector的默认容量大小,capacityIncrement是每次Vector容量增加时的增量值。 public Vector(int capacity, int capacityIncrement) // 创建一个包含collection的Vector public Vector(Collection<? extends E> collection)
-
Vector 常用API实例汇总
public class VectorDemo { public static void main(String args[]) { // initial size is 3, increment is 2 Vector v = new Vector(3, 2); System.out.println("Initial size(容量大小): " + v.
-