在數據結構中,我們比較熟悉的有:數組,鏈表,樹,棧,隊列。那麼就這幾種基本的數據結構來說,也是存在一些應用上的區別的。
數組,鏈表,樹:這幾種是最基本的數據結構,常常用來實際存儲數據。
棧,隊列這兩種數據結構一般是用作程序員實現算法時的工具,在java中有一些jdk提供的類,是對相應接口的實現,比較抽象,且有訪問受限的特性。
1.棧
棧一般基於數組或者鏈表來製作,數組和鏈表是棧中實際存儲數據所使用的數據結構。它最基本的特性是“先進後出,後進先出”,不滿足這條規則的數據結構不是棧。
在java中jdk裏已經有一些實現的棧,或者具有棧的功能的更強大的類型。那麼爲了解棧的特性,我們基於數組DIY一個簡單的棧。
思路:棧一般有一個棧頂指針top,指向棧頂元素的位置。實際存儲數據的結構我們使用數組。另外棧應該具有一些基本的操作,push(入棧),pop(出棧),peek(查看棧頂元素),isEmpty(棧是否空),isFull(棧是否滿)。
下面是java代碼:
//將域都設爲私有,只能通過公有的方法訪問,以滿足棧的訪問受限特性 public class Stack{ private int[] elements; //棧中存儲的元素是int型的,用int型數組來存儲 private int top; //棧頂指針,指向棧頂 private int MAXSIZE = 20; // 用於存儲數據的數組長度,也是棧的最大容量 public Stack(){ this.elements = new int[MAXSIZE]; top = -1; } //入棧 public void push(int index) { stackElements[++top] = index; } //出棧 public int pop() { return stackElements[top--]; } //查看棧頂元素 public int peek() { return stackElements[top]; } // 查看棧是否爲空 public boolean isEmpty() { if (top == -1) { return true;//爲空 } else { return false; } } }
那麼這就是一個最簡單的棧。剛纔我們提到java中已經有一些內置的類,如LinkedList等等,這些類型從其提供的方法來看,既可以是棧也可以是隊列或者其他的數據結構。那麼如果我們的算法希望用到一個嚴格的棧。我們可以自己diy一個棧,像上面的程序那樣。同時,我們也可以自己寫一個類來封裝那些高級的類。將其設爲我們自定義類中的private域,然後封裝一些他的滿足棧特性的公有方法作爲接口暴露出來,供其他類訪問即可。
2.隊列
隊列一般來說具有先進先出特性。那麼隊列一般也是基於數組和鏈表來實現的,也就是說其底層用來實際存儲數據的數據結構也是數組或者鏈表。
那麼,一般來說,隊列有基礎隊列,循環隊列,雙端隊列,優先級隊列。後兩種隊列就不再具有先進先出的特性了。但是其也是基礎隊列的變種。
雙端隊列,簡單來說就是兩邊都可以remove的隊列。
優先級隊列呢,就是說數據在隊列中是有一個特定的順序的,所有插入時,要先排序,再從指定位置插入,所以不再是隻能從rear隊尾插入。其他的和基礎隊列都是類似的。
下面我們diy一個簡單的循環隊列。
//一個循環隊列,先進先出,基於數組實現、 // public class Queue { private int MAXSIZE;//隊列的最大長度 private long[] elements; private int front;//指向隊首位置 private int rear;//指向隊尾位置 private int nums;//隊列中實際元素的個數,可用於判斷隊列空滿狀態 public Queue(int MAXSIZE) { this.MAXSIZE = MAXSIZE; elements = new long[MAXSIZE]; this.front = 0; this.rear = -1; this.nums = 0; } public void add(long ele){ if(rear==(MAXSIZE-1)){ rear = -1; } elements[++rear] = ele; nums++; } public long remove(){ long temp = elements[front++]; if(front==MAXSIZE){ front = 0; } nums--; return temp; } public long peek(){ return elements[front]; } public boolean isEmpty(){ if(nums==0){ return true; }else return false; } public boolean isFull(){ if(nums==MAXSIZE){ return true; }else{ return false; } } }
那麼以上就是隊列和棧的簡單理解了。