數據結構學習筆記--棧

爲何要學習數據結構?

相信你們都聽過一句話程序=數據結構+算法,數據結構和算法是脫離編程語言而存在的,不一樣的語言有不一樣的實現版本,但內在的邏輯卻不會有變化,所體現的編程思想不會有變化。雖然前端可能對數據結構和算法的要求沒有那麼高,可是做爲一個程序員數據結構是咱們應該掌握的基本知識。javascript

一、棧的定義

棧是一種特殊的線性表,咱們只可以在棧頂對其進行操做,有着先進後出的特色前端

二、棧的實現

實現棧能夠用數組來存儲數據,這是最簡單的方式。java

// 定義一個stack類
function Stack() {
    let items = [] // 用於存儲數據,
}

複製代碼

2.1定義棧的一些經常使用的方法

  • push 添加一個元素到棧頂
  • pop 彈出棧頂元素
  • top 返回棧頂元素,注意,不是彈出
  • isEmpty 判斷棧是否爲空
  • size 返回棧裏元素的個數
  • clear 清空棧

你還能夠定義其餘你認爲你將要用到的方法,這些只是一些經常使用的方法程序員

push

// 添加一個元素到棧頂
this.push = (data) => {
    items.push(data)
}
複製代碼

pop

// 刪除棧頂元素
this.pop = () => {
    return items.pop()
}
複製代碼

top

// 返回棧頂元素
this.top = () => {
    return items[items.length - 1]
}
複製代碼

isEmpty

// 檢查棧是否爲空
this.isEmpty = () => {
    return items.length === 0
}
複製代碼

size

// 返回棧的大小
this.size = () => {
    return items.length
}
複製代碼

clear

// 清空棧
this.clear = () => {
    items = []
}
複製代碼

最終代碼算法

function Stack() {
    let items = []
    this.push = (data) => {
        items.push(data)
    }
    this.pop = () => {
        return items.pop()
    }
    this.top = () => {
        return item[items.length - 1]
    }
    this.isEmpty = () => {
        return items.length === 0
    }
    this.size = () => {
        return items.length
    }
    this.clear = () => {
        items = []
    }
}

複製代碼

三、棧的應用

3.一、檢查括號的合法性

下面的字符串中包含小括號,請編寫一個函數判斷字符串中的括號是否合法,所謂合法,就是括號成對出現編程

  • sdf(ds(ew(we)rw)rwqq)qwewe 合法
  • (sd(qwqw)sd(sd)) 合法
  • ()()sd()(sd()fw))( 不合法

思路分析

括號存在嵌套關係,也存在並列關係,若是是用數組存儲這些括號,而後再想辦法一對一對的抵消掉,彷佛是一個可行的辦法,但是如何判斷一個左括號對應的是哪一個右括號呢?站在數組的肩膀上思考這個問題,就陷入到一種無從下手的絕望之中。數組

如今,咱們站在棧的肩膀上思考這個問題,解題的步驟就很是簡單,咱們可使用for循環遍歷字符串的每個字符,對每一個字符作以下的操做:數據結構

  • 遇到左括號,就把左括號壓如棧中
  • 遇到右括號,判斷棧是否爲空,爲空說明沒有左括號與之對應,缺乏左括號,字符串括號不合法,若是棧不爲空,則把棧頂元素移除,這對括號抵消掉了

當for循環結束以後,若是棧是空的,就說明全部的左右括號都抵消掉了,若是棧裏還有元素,則說明缺乏右括號,字符串括號不合法。數據結構和算法

代碼實現

function is_leagl(str) {
    let stack = new Stack()
    for(let i = 0; i < str.length; i ++) {
        let item = str[i]
        if(item === '(') { // 左括號入棧
            stack.push(item)
        } else if (item === ')') { // 右括號
            if(stack.isEmpty()) { // 檢查棧是否爲空
                return false
            } else { // 不爲空彈棧
                stack.pop()
            }
        }
    }
}
複製代碼

棧還有其餘不少的應用好比:一、計算代數式;二、構造表達式;三、用於函數得調用等等。編程語言

四、最後

在學習了棧以後瞭解到了它的方便之處,雖然是基於數據來實現的,可是在某些場景使用起來比數據更加方便快捷。後面會繼續學習隊列、鏈表、樹、圖等其餘數據結構來豐富本身的知識。

相關文章
相關標籤/搜索