資料結構-js實現棧和佇列

codeXiu發表於2019-05-22

我們都知道資料結構對我們非常重要,我在幾場筆試題中遇到了非常多的有關資料結構的問題。因為我學習資料結構在一年多以前了,有點忘了,所以今天想好好溫習一下資料結構的知識,先從簡單的資料結構說起吧。

我們都知道棧是一個墳場重要的資料的一種結構,它在我們的計算機很多方面都用到了,也包括我們的呼叫棧之類的,都有有關棧的知識。我們先說一下棧。網上有好多有陣列的方法實現的,那樣太簡單了,但是我不想那樣,因為我想自己實現一個,不想用陣列的API。

  • 棧的特點
    • 後進先出(LIFO)(先進後出)
    • 只允許操作棧頂,不能操作棧底
  • 棧示例 偷偷地到了一張圖,如有侵權馬上撤回。
    資料結構-js實現棧和佇列
    我就不多介紹棧了,相信大家都很清楚。 我們就來說一下棧的操作吧。
  1. 初始化棧(init、建構函式)
  2. 獲取棧頂元素(Top)
  3. 出棧 (Pop)
  4. 入棧 (Push)
  5. 獲取棧的長度 (Length)
  6. 判斷棧是否為空 (isEmpty)
  7. 清空棧 (Clear)
  8. 輸出棧內元素 (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();
複製程式碼

資料結構-js實現棧和佇列
我覺得棧是一種思想,對資料的管理或者是操作的方式,我覺得每一個人都有每一個人實現的方式和對棧的理解,所以我覺得不必非得按照什麼樣的格式,只要實現了這樣一個操作就行。

  • 棧的應用
    • 進位制轉換
    • 括號或者是成對的匹配問題
    • 等等

前面聊完了棧,那麼就一定有一個跟它思想類似的佇列要說一下。下面我們來聊一聊佇列。

  1. 佇列
  • 佇列在我們的計算機中也是大量的應用,比如我們的訊息佇列之類的。
  • 特點
    • 先進先出(FIFO)
    • 隊尾插入,隊頭刪除
  • 例項

資料結構-js實現棧和佇列
就像是我們平常的排隊一樣。

  • 基本操作
  1. 初始化(建構函式、init)
  2. 入隊(EnQueue)
  3. 出隊(DeQueue)
  4. 隊頭元素(Top)
  5. 長度(Length)
  6. 判斷隊是否為空(QueueEmpty)
  7. 輸出隊內元素(List)
  8. 清空佇列(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());
複製程式碼
  • 輸出
    資料結構-js實現棧和佇列
  • 遺憾

佇列還有好幾種,比如說迴圈佇列,就是隊頭、隊尾兩個指標,用能力的人可以實現以下。

  • 總結
  1. 這次算是自己的溫習,也想讓大神們監督和指出錯誤。好久沒有寫過棧和佇列的實現了,記得一年以前在上大二的時候,我們用C語言實現棧和佇列,現在想起來還意猶未盡。記得那時候用佇列和棧實現一個停車場進出車的功能。
  2. 寫這篇文章的時候心裡很不踏實,總感覺哪裡寫的不對,希望不要誤人子弟,也希望大神們能指出我的錯誤,能讓我更加的認識資料結構與棧和佇列。

相關文章