之前就学过数据结构这门课,当时有用c/c++实现过线性表的顺序存储、单链表、双向链表、顺序栈、链栈、图等数据结构;学了java也有一段时间了,最近一直在为投简历求值而努力着,想着对于大公司来说,对于本科生的要求基本上都要熟悉或者掌握常用的数据结构以及算法,所以准备着重新用java实现一遍以前学过的、现在也很常用或者很常考的一些数据结构以及算法。
线性表之顺序存储-----java实现
要求:
* 1.设置一个常量:常量在默认构造的时候会用到,用来构造初始化长度的数组;
* 2.设置两个变量,size:用来存储数组中元素的个数,capacity:用来存储数组的长度;
* 3.设置一个数组,该数组用来存储元素;
* 4.具备多个构造函数,一个初始化默认构造,默认存储大小为16;另一个为可以接收长度的构造;
* 5.提供如下几个功能:
* a.获取线性表的大小(size)
* b.根据索引返回元素
* c.根据元素查找在线性表中出现的第一个位置
* d.向顺序表中的指定位置插入元素
* e.在线性表的末端添加一个元素
* f.删除指定索引出的元素
* g.删除最后一个元素
* h.判断线性表是否为空
* i.清空线性表
java代码实现如下:
import java.util.Arrays;
public class SequenceTable<T> {
private static int DEFAULT_LENGTH=16;//线性表的默认长度
private int size=0;//元素个数
private int capacity;//当前线性表的空间大小
private Object[] elementData;//用一个数组来存储数据,代表一个线性表
//默认构造
public SequenceTable(){
elementData=new Object[DEFAULT_LENGTH];
capacity=DEFAULT_LENGTH;
}
//带一个元素的默认构造
public SequenceTable(T element){
elementData=new Object[DEFAULT_LENGTH];
capacity=DEFAULT_LENGTH;
elementData[size]=element;
size++;
}
//指定线性表长度的构造
public SequenceTable(int length){
capacity=length;
elementData=new Object[capacity];
}
//返回线性表的元素个数
public int size(){
return this.size;
}
//根据索引取元素
@SuppressWarnings("unchecked")
public T get(int index){
if(index>size-1||index<0){
throw new IndexOutOfBoundsException("索引的位置超出线性表的边界");
}
return (T)elementData[index];
}
//判断元素在线性表中出现的第一个位置
public int indexOf(T element){
for(int i=0;i<size-1;i++){
if(elementData[i].equals(element)){
return i;
}
}
return -1;
}
//在指定的位置上添加一个元素
public void add(int index,T element){
if(index<0||index>size){
throw new IndexOutOfBoundsException("索引的位置超出线性表的边界");
}
//新增的时候需要判断当前数组的长度是否足够,如果不够要扩展
ensureCapacity(size+1);
for(int i=size-1;i>=index;i--){//从数组的最后一个元素到index位置的元素进行复制
elementData[i+1]=elementData[i];
}
elementData[index]=element;
size++;
}
//默认在线性表的最后添加一个元素
public void add(T element){
add(size,element);
}
private void ensureCapacity(int minLength){
if(capacity<minLength){
while(capacity<minLength){
capacity<<=1;//capacity左移一位,等于*2;
}
elementData=Arrays.copyOf(elementData, capacity);
}
}
//删除指定位置的元素
public T delete(int index){
if(index<0||index>size-1){
throw new IndexOutOfBoundsException("索引的位置超出线性表的边界");
}
@SuppressWarnings("unchecked")
T oldValue=(T)elementData[index];
//移动元素,从index开始到线性表的结束。
for(int i= index;i<size-1;i++){
elementData[i]=elementData[i+1];
}
elementData[size-1]=null;
size--;
return oldValue;
}
//默认移除线性表的最后一个元素
public T remove(){
return delete(size-1);
}
//判断线性表是否为空
public boolean isEmpty(){
return size==0;
}
//清空线性表
public void clear(){
for(int i=0;i<size;i++){
elementData[i]=null;
}
size=0;
}
public String toString(){
String s="[";
if(isEmpty()){
return "[]";
}else{
for(int i=0;i<size;i++){
if(i<size-1){
s+=elementData[i]+",";
}else{
s+=elementData[i]+"]";
}
}
return s;
}
}
}