线性表
实现线性表的方式有两种:
一种是使用数组(array)存储线性表中的元素。数组是动态创建的,是一种大小固定的数据结构,一旦创建,他的大小就无法改变。如果元素个数超过了数组的容量,就创建一个更大的数组,并将当前数组中的元素复制到新数组中。当插入一个新元素时,首先确定数组是否有足够的空间,如果空间不够,则创建大小为当前数组两倍的新数组。插入时,将指定下标处后面的元素向右移动一个位置并将改线性表的大小加一。删除指定下标时,应该将该下表后面的元素向左移动一个位置,并将线性表的大小减一。
另一种是使用链式结构(Linked structure)。链式结构由结点组成,每个结点都是动态创建的,用来存储一个元素。所有的结点链接成一个线性表。在线性表中任意位置添加和删除元素,采用链式结构来实现线性表更高效。
另外还有循环单链表(circular,double linkedlist)链表中的最后一个结点的指针指回到第一个结点的单链表。
双向链表(double linkedlist)包含两个指针的结点,一个节点指向下一个结点(前向指针(forward pointer)),另一个指针指向前一个结点(backward pointer)。
循环双向链表(circular,doubly linkedlist),链表中最后一个结点的前向指针指向第一结点,且第一个结点的后向指针指向最后一个结点的双向链表。
栈和队列
栈可以看作是一种特殊类型的线性表,访问、插入和删除其中的元素只能在栈尾(栈顶)进行。而队列是一个等待的线性表,元素只能从队列的末尾插入,从开始端(队列头)访问和删除。
在设计栈类和队列类,使用组合的方式更好,这样可以定义一个全新的栈类和队列类,从而不必继承数组线性表类和链表类中不必要和不合适的地方。使用组合即:将数组线性表定义为栈类中的数据域,将链表类定义为队列类中的数据域。
public class GenericStack<E> {
private java.util.ArrayList<E> list = new java.util.ArrayList<E>();
public int getSize() {
return list.size();
}
public E peek() {
return list.get(getSize() - 1);
}
public void push(E o) {
list.add(o);
}
public E pop() {
E o = list.get(getSize() - 1);
list.remove(getSize() - 1);
return o;
}
public boolean isEmpty() {
return list.isEmpty();
}
}
优先队列
在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先被删除。可以使用堆来实现优先队列,其中根结点是队列中具有最高优先级的对象。
总结:其实这一块最重要的就是栈和队列类不是直接继承下来的。