今天看了一本書《啊哈 算法》,書的內容不多,一共兩章,第一章是常見的排序算法包括桶排序、冒泡排序和快速排序,這些事基礎的排序算法網上有很多資料說明,這里主要說第二章棧,對列,鏈表,書上使用c語言實現的,這里用java代碼自己實現下,可能略有不同
棧:這是一個先進后出的數據結構,生活中類似的瀏覽器的返回上一頁就可以利用此結構實現,代碼如下:
public class Stack<T> { private Object[] data;//存儲數據 private int top;//表示棧頂元素 public Stack(){ data = new Object[100];//為了說明原理隨意指定 top =-1; } public synchronized void put(T t){ //壓棧 data[data.length] = t; top++; } public synchronized T pop(){ //出棧 if(top<0){ return null; } T t = (T) data[top]; top --; return t; } }
這只是我自己的Java實現只說明原理,但實際在java中是利用vector來存儲數據的,我們知道vector其實是一個線程安全的ArrayList,而ArrayList的底層也是一個數組,所以原理上大同小異
隊列:隊列其實就是我們生活中的排隊現象,先進入的先出,后進入的后出,代碼實現如下:
public class Queue<T> { private Object[] data; //存儲數據 private int head; //頭 private int tail; //尾 public Queue(){ data = new Object[100];//為了說明原理隨意指定 head =1; tail =1; } public void put(T t){ data[tail] =t; tail++; } public T get(){ T t =(T) data[head]; head ++; return t; } }
如上所示,也只是說明原理,其實在java jdk中也有許多不同的對列,並且對列可以由數組實現,也可以由鏈表實現,下面介紹鏈表
鏈表是一個類似於現實中串項鏈的數據結構,前一個數據指向后一個數據,當然也可以后一個數據指向前一個數據,這就是雙向鏈表,這里不做討論
public class MyNode<T> {
private Node<T> headNode ;
public MyNode(T t){
headNode = new Node<>(t,null);
}
public MyNode(){
}
private static class Node<E> {
Object e;
Node<E> next;
Node(E element, Node<E> next) {
this.e = element;
this.next = next;
}
}
public void put(T t){
if(headNode==null){
headNode = new Node<>(t,null);
}else {
headNode= new Node<>(t,headNode);
}
}
public T get(int index){
Node node = headNode;
for(int i=2;i<index;i++){
node= node.next;
}
T t = (T) node.e;
return t;
}
}
以上就是用Java實現的簡單鏈表,還有雙向鏈表是一個元素指向前一個元素和后一個元素,原理大概相同,這里可以看書鏈表中取固定位置的數據是非常麻煩的,必須從第一個開始依次查找,這也就是linklist不用for(int i=0;i++;i<size())遍歷的原因,因為linklist的底層就是通過鏈表來實現的。