JavaScript數據結構02 - 棧

一、定義

1.1 背景

通過前面一節《JavaScript數據結構01 - 數組》我們知道,可以在數組的任意位置上刪除或添加元素。然而,有時候我們還需要一種在添加或刪除元素時有更多控制的數據結構。

有兩種數據結構類似於數組,但在添加和刪除元素時更爲可控。

它們就是棧和隊列

1.2 概念

是一種遵循後進先出(LIFO)原則的有序集合。新添加的或待刪除的元素都保存在棧的末尾,稱作棧頂,另一端就叫棧底

在棧裏,新元素都靠近棧頂,舊元素都接近棧底。

棧也被用在編程語言的編譯器和內存中保存變量、方法調用等,比如函數的調用棧。

二、棧的實現

2.1 創建一個類來表示棧

這裏我還是用構造函數的形式來書寫,大家有興趣可以用ES6的Class來重寫一遍。

// Stack類
function Stack () {
  this.items = [];

  this.push = push;
  this.pop = pop;
  this.peek = peek;
  this.isEmpty = isEmpty;
  this.clear = clear;
  this.size = size;
  this.print = print;
}
複製代碼

棧裏面有一些聲明的方法:

  • push(element):添加一個(或幾個)新元素到棧頂
  • pop():移除棧頂的元素,同時返回被移除的元素
  • peek():返回棧頂的元素,不對棧做任何修改
  • isEmpty():如果棧裏沒有任何元素就返回true,否則返回false
  • clear():移除棧裏的所有元素
  • size():返回棧裏的元素個數

2.2 實現棧中的輔助方法

// 添加新元素到棧頂
function push (element) {
  this.items.push(element);
}

// 移除棧頂元素,同時返回被移除的元素
function pop () {
  return this.items.pop();
}

// 查看棧頂元素
function peek () {
  return this.items[this.items.length - 1];
}

// 判斷是否爲空棧
function isEmpty () {
  return this.items.length === 0;
}

// 清空棧
function clear () {
  this.items = [];
}

// 查詢棧的長度
function size () {
  return this.items.length;
}

// 打印棧裏的元素
function print () {
  console.log(this.items.toString());
}
複製代碼

2.3 創建實例進行測試

// 創建Stack實例
var stack = new Stack();

console.log(stack.isEmpty());     // true
stack.push(5);                    // undefined
stack.push(8);                    // undefined
console.log(stack.peek());        // 8
stack.push(11);                   // undefined
console.log(stack.size());        // 3
console.log(stack.isEmpty());     // false
stack.push(15);                   // undefined
stack.pop();                      // 15
console.log(stack.size());        // 3
stack.print();                    // 5,8,11
stack.clear();                    // undefined
console.log(stack.size());        // 0
複製代碼

三、結束

完整代碼可以到我的github倉庫查看,如果對你有幫助的話歡迎點一個Star~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章