JavaScript數據結構 - 棧

前言

若是你問我,人可否改變本身的命運,我也不曉得。但我曉得,不認命,就是咱們這代人的命。javascript

  1. 基礎知識就像是一座大樓的地基,它決定了咱們的技術高度。
  2. 咱們應該多掌握一些可移值的技術或者再過十幾年應該都不會過期的技術,數據結構與算法就是其中之一。

正文

棧的使用遍及程序語言實現的方方面面,從表達式求值處處理函數調用。java

棧(stack) 是限定在表尾進行插入或刪除操做的線性表。所以,對棧來講,表尾端有其特殊含義,稱爲 棧頂(top) ,相應地,表頭端稱爲 棧底(bottom) 。不含元素的空表稱爲空棧。node

棧的定義

  1. 後進者先出,先進者後出,簡稱 後進先出(LIFO) ,這就是典型的 結構。
  2. 新添加的或待刪除的元素都保存在棧的末尾,稱爲 棧頂 ,另外一端就叫 棧底
  3. 插入通常稱爲 入棧(push) ,刪除則稱爲 出棧(pop)
  4. 在棧裏,新元素都靠近棧頂,舊元素都靠近棧底。
  5. 從棧的操做特性來看,是一種 操做受限 的線性表,只容許在一段插入和刪除數據。
  6. 不包含任何元素的棧稱爲 空棧

棧的實現

從數據存儲的角度看,實現棧有兩種方式,一種是以數組作基礎,一種是以鏈表作基礎。算法

棧的方法:數組

操做 方法
入棧 push(el)
出棧 pop()
取棧頂元素 peek()
判斷是否爲空棧 isEmpty()
返回棧大小 size()
清空棧 clear()

順序棧

這裏採用的是數組做爲其存儲數據的底層數據結構。bash

用數組 _data 保存棧內元素,構造函數將其初始化爲一個空數組。數據結構

class Stack {
    constructor() {
        this._data = [];
    }
    push(el) {  // 添加新元素到棧頂
        this._data.push(el);
    }
    pop() {     // 移除棧頂元素,同時返回被移除的元素
        return this._data.pop();
    }
    peek() {    // 查看棧頂元素
        return this._data[this._data.length - 1];
    }
    isEmpty() { // 判斷是否爲空棧
        return this._data.length === 0;
    }
    clear() {   // 清空棧
        this._data = [];
    }
    size() {    // 查詢棧的大小
        return this._data.length;
    }
    // 非必重寫方法,僅供測試使用
    // 重寫 JavaScript 對象默認的 toString() 方法
    // toString() {
    // return this._data.toString();
    // }
}
複製代碼

鏈棧

這裏採用的是鏈表做爲其存儲數據的底層數據結構。函數

鏈式棧是一種數據存儲結構,能夠經過單鏈表的方式來實現,使用鏈式棧的優勢在於它可以克服用數組實現的順序棧空間利用率不高的特色,可是須要爲每一個棧元素分配額外的指針空間用來存放指針域。測試

function Stack() {
    this._top = null;
    this._len = 0;
}
Stack.prototype = {
    constructor: Stack,
    __Node__: function(el) {
        this.data = el;
        this.next = null;
    },
    push: function(el) {      // 添加新元素到棧頂
        const __node__ = new this.__Node__(el);
        __node__.next = this._top;
        this._top = __node__;
        this._len++;
    },
    pop: function() {       // 移除棧頂元素,同時返回被移除的元素
        if(this._top == null) return;
        const node = this._top;
        this._top = node.next;
        this._len--;
        return node.data;
    },
    peek: function() {      // 查看棧頂元素
        return this._top && this._top.data;
    },
    isEmpty: function() {   // 判斷是否爲空棧
        return this._top === null;
    },
    clear: function() {     // 清空棧
        this._top = null;
        this._len = 0;
    },
    size: function() {      // 查詢棧的大小
        return this._len;
    },
    // 非必重寫方法,僅供測試使用
    // 重寫 JavaScript 對象默認的 toString() 方法
    // toString: function() {
    // let curr = this._top,
    // list = [];
    // while(curr) {
    // list.push(curr.data);
    // curr = curr.next;
    // }
    // return list.join(' -> ');
    // }
}
複製代碼

上述順序棧、鏈棧測試用例:this

const stack = new Stack();
stack.isEmpty();    // true
stack.push(5);      // undefined
stack.push(8);      // undefined
stack.peek();       // 8
stack.push(11);     // undefined
stack.size();       // 3
stack.isEmpty();    // false
stack.push(15);     // undefined
stack.pop();        // 15
stack.size();       // 3
stack.toString();   // 5,8,11
stack.clear();      // undefined
stack.size();       // 0
複製代碼

結語

棧就是一種數據結構,他可用來解決計算機世界裏的不少問題。棧是一種高效的數據結構,由於數據只能在棧頂添加或刪除,因此這樣的處理操做很快,並且容易實現。棧的使用遍及程序語言實現的方方面面,從表達式求值處處理函數調用等。

若是有錯誤或者不嚴謹的地方,請務必給予指正,十分感謝。

相關文章
相關標籤/搜索