我們都知道資料結構對我們非常重要,我在幾場筆試題中遇到了非常多的有關資料結構的問題。因為我學習資料結構在一年多以前了,有點忘了,所以今天想好好溫習一下資料結構的知識,先從簡單的資料結構說起吧。
- 棧
我們都知道棧是一個墳場重要的資料的一種結構,它在我們的計算機很多方面都用到了,也包括我們的呼叫棧之類的,都有有關棧的知識。我們先說一下棧。網上有好多有陣列的方法實現的,那樣太簡單了,但是我不想那樣,因為我想自己實現一個,不想用陣列的API。
- 棧的特點
- 後進先出(LIFO)(先進後出)
- 只允許操作棧頂,不能操作棧底
- 棧示例 偷偷地到了一張圖,如有侵權馬上撤回。 我就不多介紹棧了,相信大家都很清楚。 我們就來說一下棧的操作吧。
- 初始化棧(init、建構函式)
- 獲取棧頂元素(Top)
- 出棧 (Pop)
- 入棧 (Push)
- 獲取棧的長度 (Length)
- 判斷棧是否為空 (isEmpty)
- 清空棧 (Clear)
- 輸出棧內元素 (List)
我羅列的可能不清楚或者是不專業,請大家多多指正。(這只是我個人理解的棧的實現)
class Stack {
constructor(){
this.stacks = [];
this.length = 0;
}
Top(){
return this.stacks[this.length - 1];
}
Pop(){
return this.stacks.splice(-- this.length, 1)[0];
}
Push(val){
this.stacks[this.length ++] = val;
}
Length(){
return this.length;
}
isEmpty(){
return this.length === 0;
}
Clear(){
this.stacks = [];
this.length = 0;
}
List(){
for (var i = this.length - 1; i >= 0; i --) {
console.log(this.stacks[i]);
}
}
}
複製程式碼
我們來驗證一下
console.log('-------------棧-----------------');
let stack = new Stack();
console.log("為空" + stack.isEmpty());
console.log("長度" + stack.Length());
stack.Push(0);
stack.Push(1);
stack.Push(2);
console.log("長度" + stack.Length());
stack.List();
console.log("棧頂元素" + stack.Top());
console.log("出棧" + stack.Pop());
console.log("出棧" + stack.Pop());
console.log("棧頂元素" + stack.Top());
stack.Clear();
console.log("清棧");
console.log("長度" + stack.Length());
stack.List();
複製程式碼
我覺得棧是一種思想,對資料的管理或者是操作的方式,我覺得每一個人都有每一個人實現的方式和對棧的理解,所以我覺得不必非得按照什麼樣的格式,只要實現了這樣一個操作就行。
- 棧的應用
- 進位制轉換
- 括號或者是成對的匹配問題
- 等等
前面聊完了棧,那麼就一定有一個跟它思想類似的佇列要說一下。下面我們來聊一聊佇列。
- 佇列
- 佇列在我們的計算機中也是大量的應用,比如我們的訊息佇列之類的。
- 特點
- 先進先出(FIFO)
- 隊尾插入,隊頭刪除
- 例項
- 基本操作
- 初始化(建構函式、init)
- 入隊(EnQueue)
- 出隊(DeQueue)
- 隊頭元素(Top)
- 長度(Length)
- 判斷隊是否為空(QueueEmpty)
- 輸出隊內元素(List)
- 清空佇列(ClearQueue)
- 程式碼
class Queue{
constructor(){
this.queue = [];
this.length = 0;
}
EnQueue(val){
this.queue[this.length ++] = val;
}
DeQueue(){
this.length --;
return this.queue.splice(0, 1)[0];
}
List(){
for (var i = 0; i < this.length; i++) {
console.log( this.queue[i] );
}
}
Top(){
return this.queue[0];
}
Length(){
return this.length;
}
QueueEmpty(){
return this.length === 0;
}
ClearQueue(){
this.queue = [];
this.length = 0;
}
}
複製程式碼
- 操作示例
let queue = new Queue();
console.log("長度" + queue.Length());
console.log("為空" + queue.QueueEmpty());
queue.EnQueue(0);
queue.EnQueue(1);
queue.EnQueue(2);
console.log("長度" + queue.Length());
console.log("隊頭" + queue.Top());
console.log("出隊" + queue.DeQueue());
console.log("出隊" + queue.DeQueue());
console.log("隊頭" + queue.Top());
queue.List();
queue.ClearQueue();
console.log('清空佇列');
console.log("長度" + queue.Length());
console.log("為空" + queue.QueueEmpty());
複製程式碼
- 輸出
- 遺憾
佇列還有好幾種,比如說迴圈佇列,就是隊頭、隊尾兩個指標,用能力的人可以實現以下。
- 總結
- 這次算是自己的溫習,也想讓大神們監督和指出錯誤。好久沒有寫過棧和佇列的實現了,記得一年以前在上大二的時候,我們用C語言實現棧和佇列,現在想起來還意猶未盡。記得那時候用佇列和棧實現一個停車場進出車的功能。
- 寫這篇文章的時候心裡很不踏實,總感覺哪裡寫的不對,希望不要誤人子弟,也希望大神們能指出我的錯誤,能讓我更加的認識資料結構與棧和佇列。