棧與隊列和數組、鏈表、樹這幾種數據結構不太同樣。棧與隊列主要是作爲程序員的工具來使用,它們主要作爲構思算法的輔助工具,而不是徹底的數據存儲工具。程序員
它們的生命週期比數組那些要短得多,在程序執行期間它們纔會被建立,任務執行完就會被銷燬。web
一 棧
棧是一種只能在一端進行插入和刪除數據的數據結構,這一端被稱爲棧頂(top)。其特色簡單來說就是先進後出。棧的主要機制能夠用數組來實現,固然也能夠用鏈表來實現。算法
用數組實現棧,並完成經常使用操做——出棧、入棧、查看元素(只能查看棧頂元素)、判斷棧是否爲空等操做。數組
public class StackTest {
private long[] arr;
// 棧頂
private int top;
public StackTest(){
arr = new long[10];
top = -1;
}
public StackTest(int maxsize){
arr = new long[maxsize];
top = -1;
}
/**
* 添加數據
* @param value
*/
public void push(int value){
arr[++top] = value;
}
/**
* 移除數據
* @return
*/
public long pop() {
return arr[top--];
}
/**
* 查看數據
* @return
*/
public long peek(){
return arr[top];
}
public boolean isEmpty(){
return top == -1;
}
/***
* 判斷是否滿了
* @return
*/
public boolean isFull(){
return top == arr.length-1;
}
}
棧的全部操做複雜度都爲O(1),棧的操做不依賴棧中元素大小,棧不須要移動和比較操做。微信
二 隊列
隊列的特色是先進先出。隊列也是用數組來實現。數據結構
用數組實現隊列,並完成經常使用操做——出隊、入隊、查看元素、判斷隊列是否爲空等操做。app
public class QueueTest {
private long[] arr;
// 有效數據的大小
private int elements;
// 隊頭
private int front;
// 隊尾
private int end;
public QueueTest(){
arr = new long[10];
elements = 0;
front = 0;
end = -1;
}
public QueueTest(int maxsize){
arr = new long[maxsize];
elements = 0;
front = 0;
end = -1;
}
/**
* 插入數據
* @param value
*/
public void insert(long value){
arr[++end] = value;
elements++;
}
/**
* 刪除數據
* @return
*/
public long remove(){
elements--;
return arr[front++];
}
/**
* 查看數據,從對頭查看
* @return
*/
public long peek(){
return arr[front];
}
/**
* 判斷是否爲空
* @return
*/
public boolean isEmpty(){
return elements == 0;
}
public boolean isFull(){
return elements == arr.length;
}
}
隊列的插入、刪除等操做的複雜度都爲O(1)。編輯器
三 優先級隊列
優先級隊列和普通隊列同樣,也是一個隊頭,一個隊尾,從隊頭移除元素,優先級隊列中,數據項是有序的,這樣插入數據的時候就會根據某種規則去比較,而後插入到隊列合適的位置。所以,優先級隊列插入的複雜度爲O(N),刪除和查看元素的複雜度爲O(1)。工具
用數組實現優先級隊列,並完成經常使用操做——出隊、入隊、查看元素、判斷隊列是否爲空等操做。ui
public class FirstQueueTest {
private long[] arr;
// 有效數據的大小
private int elements;
// 隊頭
private int front;
// 隊尾
private int end;
public FirstQueueTest(){
arr = new long[10];
elements = 0;
front = 0;
end = -1;
}
public FirstQueueTest(int maxsize){
arr = new long[maxsize];
elements = 0;
front = 0;
end = -1;
}
/**
* 插入數據
* @param value
*/
public void inser(long value){
if(elements == 0){
arr[++end] = value;
elements++;
}else{
// 按某種規則進行比較,這裏使用value的大小比較,按從小到大排序
for(int i = elements-1;i>=0;i--){
if(value<arr[i]){
arr[i+1] = arr[i];
arr[i] = value;
}else{
arr[i+1] = value;
break;
}
}
elements++;
end++;
}
}
/**
* 刪除數據
* @return
*/
public long remove(){
elements--;
return arr[front++];
}
/**
* 查看數據,從對頭查看
* @return
*/
public long peek(){
return arr[front];
}
/**
* 判斷是否爲空
* @return
*/
public boolean isEmpty(){
return elements == 0;
}
public boolean isFull(){
return elements == arr.length;
}
}
四 總結
-
棧的特色是先進後出,棧只能查看棧頂的一個元素 -
隊列的特色是先進先出,只能查看隊頭的一個元素 -
優先級隊列插入一條元素,平均須要移動2/N個元素,所以插入的複雜度爲O(N) -
棧和隊列,能夠用數組實現,也能夠用其餘數據結構實現 -
棧和隊列是爲了完成某些工做,手動構造的數據結構
本文分享自微信公衆號 - Java旅途(Javatrip)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。