一、线性表的定义
线性表
是同一类型数据的一个有限序列
,线性表中数据元素之间的关系是一对一的关系
,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接
的。
线性表的顺序存储要求地址空间是连续的,地址必须一个接一个,不能中断
。如下图为顺序存储结构:
二、顺序存储结构
线性表
的顺序存储每个节点只包含数据部分
,不需要额外包含数据之间的关系,因为数据之间
的关系通过地址连续
来体现,所以非常省空间
它的优点访问非常快速,因为地址是连续的
,只要知道首地址,任意一个元素的地址都可以算出来。假设每个地址占c个空间,则第i个地址为(i-1)*c。
它的缺点是在插入和删除数据时
,可能要移动许多数据,比如一个10000个元素的有序数据,如果我删除了第二个元素,为了继续保持地址连续,所以要把后面9999个元素都向前移动。
三、栈的定义
栈(stack)是限定仅在表尾
进行插入和删除操作的线性表
。
我们把允许插入和删除的一端称为栈顶(top)
,另一端称为栈底(bottom)
。
栈又称作后进先出线性表——Last In First Out(LIFO)
注意:栈是一个被限制的线性表,不提供从中间任何位置删除、插入、访问元素的方法。也就是说栈只能够在栈顶插入和删除元素
。
栈来自与线性表
,因此栈
可以使用顺序表
的方式来实现也可以使用链表的方式
来实现。
系统栈记录中断的点,调用完其他方法后继续运行
代码:
Array.class
package code.ArrayCode;
public class Array<E> {
private E[] data;
private int size;
/*
* 构造函数,传入数据的容量capacity构造Array
* */
public Array(int capacity){
data = (E[])new Object[capacity];
size = 0;
}
//无参数的构造函数,默认数据的容量capacity=10
public Array(){
this(10);
}
//获取数组中的元素个数
public int getSize(){
return size;
}
//获取数组的容量
public int getCapacity(){
return data.length;
}
//返回数组是否为空
public boolean isEmpty(){
return size==0;
}
//在最后一位添加数据
public void addLast(E e){
add(size,e);
}
//在开头添加数据
public void addFirst(E e){
add(0,e);
}
public void add(int index , E e){
//判断index是不是合法的
// 如果index为负数则不合法
// 如果index > size则说明数组中间有空余的位置,并非紧密排列
if(index < 0 || index > size){
throw new IllegalArgumentException("Add failed. Require index >= 0 || index <= size.");
}
//判断数组满了没有
if(size == data.length){
resize(2 * data.length);
}
//从最后一位开始移位,当i=index的时候,index位置上还是有原来位置的数据,
//只不过index和index+1这两个位置的数据一样,原来index位置上的值复制到了index+1
//所以我们可以放心的用新数据覆盖掉index位置上的值
for(int i = size -1 ; i >= index ; i--){
data[i+1] = data[i];
}
//用新值覆盖原index位置上的值
data[index] = e;
size++;
}
//取出索引为index的这个元素
//通过get方法是无法获取没有值的索引
E get(int index){