「棧」是我們常常聽到的乙個術語,那麼什麼是棧呢,很簡單,棧(stack)是乙個後進先出(last in first out,簡稱:lifo)的線性表,它只能從一端新增元素,也只能從一端去除元素,這一端就稱為:棧頂。在計算機的世界中,棧是有著一些不可思議的作用的,例如你在編輯器中輸入你想要輸入的文字是,當你發現輸入有誤時,你會進行撤回的操作。而這就是無處不在的undo操作。還有你安裝軟體時的next和back操作等等。
接下來我們就將繼續我們的探索之路,來自己手寫實現乙個棧功能。
public inte***ce stack
棧的機制可以用陣列來實現,也可以用鍊錶來實現,我們將用上篇文章「小小陣列」,不可小覷中所建立的陣列來實現棧的基本操作:
package com.zfy.stackorqueues;
public class array
//無引數建構函式,預設陣列的容量capacity=10
public array()
//獲取陣列中的元素個數
public int getsize()
//獲取陣列的容量
public int getcapacity()
//返回陣列是否為空
public boolean isempty()
//向所有元素後新增乙個新元素
public void addlast(e e)
// 在所有元素前新增乙個新元素
public void addfirst(e e)
// 在index索引的位置插入乙個新元素e
public void add(int index, e e)
//獲取index索引位置的元素
public e get(int index)
public e getlast()
public e getfirst()
//修改index索引位置的元素為e
public void set(int index, e e)
//查詢陣列中是否有元素e
public boolean cotains(e e)
//查詢陣列中元素e所在的索引,如果不存在元素e,則返回-1
public int find(e e)
//從陣列中刪除index位置的元素, 返回刪除的元素
public e remove(int index)
//從陣列中刪除第乙個元素, 返回刪除的元素
public e removefirst()
// 從陣列中刪除最後乙個元素, 返回刪除的元素
public e removelast()
//從陣列中刪除元素e
public void removeelement(e e)
@override
public string tostring()
}return res.tostring();
} // 將陣列空間的容量變成newcapacity大小
private void resize(int newcapacity)
}
package com.zfy.stackorqueues;
public class arraystackimplements stack
public arraystack()
@override
public int getsize()
@override
public boolean isempty()
public int getcapacity()
@override
public void push(e e)
@override
public e pop()
@override
public e peek()
@override
public string tostring()
} return res.tostring();
}}
1.測試類:
public static void main(string args)
stack.pop();
system.out.println(stack);
}
2.實現符號匹配功能
public boolean isvalid(string s) ' && topchar != '
}return stack.isempty();
}public static void main(string args) "));
system.out.println((new solution()).isvalid("([)]"));
}
資料的入棧和出棧的時間複雜度均為o(1),因此這個棧在時間效能上是很好的。
佇列也是線性結構,與陣列相比較,佇列對應的操作是陣列的子集。而且佇列它只能從一端(隊尾)新增元素,且只能從另一端(隊首)取出元素。這個和我們日常生活中的排隊是類似的,因此佇列是一種先進先出(first in first out)的資料結構。接下來我們將用陣列機制來實現乙個陣列佇列。
public inte***ce queue
因為我們這個佇列和棧一樣都是用我們前面的陣列進行實現的,因此這裡就不再貼**了。
package com.zfy.stackorqueues;
public class arrayqueueimplements queue
public arrayqueue()
@override
public int getsize()
@override
public boolean isempty()
public int getcapacity()
@override
public void enqueue(e e)
@override
public e dequeue()
@override
public e getfront()
@override
public string tostring()
return res.tostring();
}public static void main(string args) }}
}
因為陣列佇列是具有侷限性的,因為它的出隊操作的複雜度為o(n)級別的,因此我們再來實現乙個迴圈陣列。
package com.zfy.stackorqueues;
public class loopqueueimplements queue
public loopqueue()
public int getcapacity()
@override
public boolean isempty()
@override
public int getsize()
@override
public void enqueue(e e)
data[tail] = e;
tail = (tail + 1) % data.length;//本來是tail++;但是由於是迴圈陣列,所以需要這樣寫
size ++;
}@override
public e dequeue()
return ret;
}@override
public e getfront()
private void resize(int newcapacity)
data = newdata;
front = 0;
tail = size;
}@override
public string tostring()
return res.tostring();
}public static void main(string args)}}
}
著了設計的迴圈佇列的出列和入列的操作的時間複雜度均為o(1)。
最後語:不積跬步,無以至千里;不積小流,無以成江海。資料結構其實是乙個非常美妙的東西,只要你能領會其中的含義,你就可能會愛不釋手,個人覺得**還是要自己動手去寫,這樣才能領會其中真意!
參考:bobobo老師的玩轉資料結構
資料結構 棧和佇列
棧 基礎 知識棧 練習題 佇列 基礎知識 棧示意圖 後進先出 順序棧結構定義 define maxsize 1024 struct stack 操作函式 push 入棧 pop 出棧 struct lstack 鏈棧示意圖 操作函式 push 入棧 pop 出棧 注意 也可以直接呼叫系統已經寫好的庫...
資料結構 棧和佇列
本章的基本內容是 兩種特殊的線性表 棧和佇列 從資料結構角度看,棧和佇列是操作受限的線性表,他們的邏輯結構相同。從抽象資料型別角度看,棧和佇列是兩種重要的抽象資料型別。p棧 限定僅在表的一端進行插入和刪除操作的線性表。p允許插入和刪除的一端稱為棧頂,另一端稱為棧底。p空棧 不含任何資料元素的棧。a ...
資料結構 棧和佇列
用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。class solution int pop node stack2.top stack2.pop return node private stack stack1 stack stack2 大家都知道斐波那契數列,現...