成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

JS數(shù)據(jù)結(jié)構(gòu)0x002:棧

noONE / 2971人閱讀

摘要:概述今天玩得是棧,棧的用處非常廣泛啊,比如函數(shù)的調(diào)用棧啊,的的的啊,之類的,一坨一坨的。

0x000 概述

今天玩得是棧,棧的用處非常廣泛啊,比如函數(shù)的調(diào)用棧啊,h5historystateapi啊,之類的,一坨一坨的。

0x001 什么是棧

棧就是一個(gè)后入先出的數(shù)組,并且這個(gè)數(shù)組只能從一端進(jìn)來(lái),再?gòu)倪@一端出去,就像是放在長(zhǎng)筒紙盒里面的羽毛球,他只有兩個(gè)動(dòng)作

push: 將數(shù)據(jù)推入棧中

pop:將數(shù)據(jù)彈出棧

0x002 初始化

依舊使用數(shù)組來(lái)模擬棧

function init() {
    return []
}
0x003 推入
function push(stack, data) {
    stack.push(data)
}
0x004 彈出
function pop(stack) {
    return stack.pop()
}
0x005 使用
function main() {
    let stack = init() // stack: []
    stack = push(stack, 1) // stack: [1]
    stack = push(stack, 2) // stack: [1, 2]
    stack = push(stack, 3) // stack: [1, 2, 3]
    pop(stack) // 3 stack:[1, 2]
    pop(stack) // 2 stack:[1]
    pop(stack) // 1 stack:[]
}

main()
0x006 注意

平常我們依舊不會(huì)這么使用,而是

let stack=[] // []
stack.push(1) // [1]
stack.push(2) // [1, 2]
stack.push(3) // [1, 2, 3]
stack.pop() // 3
stack.pop() // 2 
stack.pop() // 1
0x007 栗子:10以內(nèi)的波蘭計(jì)算器
這是一個(gè)中綴轉(zhuǎn)后綴并計(jì)算表達(dá)式結(jié)果的栗子,為了簡(jiǎn)單只實(shí)現(xiàn)10以內(nèi)任意數(shù)量的加法和減法,完整的波蘭計(jì)算器可以看另一個(gè)我的完整實(shí)現(xiàn)

效果

頁(yè)面其實(shí)可有可無(wú),這里還是實(shí)現(xiàn)了一下


核心的calculate函數(shù)

function calculate(input) {
    let tokenStack = input.split("").reverse() 
    let rpnStack = []
    let operationStack = []

    // 第一個(gè)循環(huán) 
    while (tokenStack.length) {  
        let t = tokenStack.pop()
        if (t.match(/[0-9]/)) {
            rpnStack.push(t)
            continue
        }
        if (t.match(/[+-]/)) {
            while (operationStack.length) {
                rpnStack.push(operationStack.pop())
            }
            operationStack.push(t)
            continue
        }

        throw `error: unknow charactor: ${t}`
    }
    while (operationStack.length) {
        rpnStack.push(operationStack.pop())
    }
    rpnStack = rpnStack.reverse()
    
    
    let resultStack = []
    while (rpnStack.length) {
        let t = rpnStack.pop()+""
        if (t.match(/[0-9]/)) {
            resultStack.push(+t)
            continue
        }
        if (t === "+") {
            let num1 = resultStack.pop()
            let num2 = resultStack.pop()
            rpnStack.push(num2 + num1)
            continue
        }
        if (t === "-") {
            let num1 = resultStack.pop()
            let num2 = resultStack.pop()
            rpnStack.push(num2 - num1)
            continue
        }
    }


    return resultStack[0]
}

說(shuō)明
這個(gè)函數(shù)中用了4個(gè)棧

tokenStack:用來(lái)存放詞素

operationStack:在中綴轉(zhuǎn)后綴的過(guò)程中臨時(shí)存放操作符

rpnStack:存放后綴表達(dá)式

resultStack:存放計(jì)算過(guò)程中的數(shù)字

過(guò)程說(shuō)明

將表達(dá)式分割成數(shù)組,但是不是我們要的順序,所以reverse一下:1+2-3+4-5->["5","-","4","+","3","-","2","+,"1"]

上面分割之后是中綴表達(dá)式,這里要轉(zhuǎn)化為后綴表達(dá)式:["5","-","4","+","3","-","2","+,"1"]->["1","2","+","3","-","4","+","5","-"]

將后綴表達(dá)式元素取出,如果是數(shù)組,就推入resultStack,如果是+、-,就從resultStack中取出數(shù)按符號(hào)做操作,將結(jié)果再推入resultStack,直到rpnStack為空:["1","2","+","3","-","4","+","5","-"]->-1`

0x008 資源

源代碼:https://github.com/followWinter/data-structure

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/98980.html

相關(guān)文章

  • React入門(mén)0x002: jsx

    摘要:概述也是,如是說(shuō)。屬性集合,比如等屬性對(duì)應(yīng),是關(guān)鍵詞,所以用代替,也可以是自定義的屬性。形式送方外上人送上人孤云將野鶴,豈向人間住。莫買(mǎi)沃洲山,時(shí)人已知處。 0x000 概述 jsx也是js, 如是說(shuō)。 0x001 語(yǔ)法 在上文React入門(mén)0x001-環(huán)境配置和 helloworld中, 出現(xiàn)了一句奇怪的代碼: Hello, world! 這在html中沒(méi)有任何問(wèn)題,但問(wèn)題是他出現(xiàn)在...

    hedzr 評(píng)論0 收藏0
  • es6基礎(chǔ)0x002:var、let、const、塊級(jí)作用域、暫存死區(qū)

    摘要:但是如果使用,作用域塊級(jí)作用域內(nèi),在還沒(méi)使用聲明一個(gè)變量的時(shí)候,訪問(wèn)該變量,將會(huì)獲得,從作用域開(kāi)始到語(yǔ)句之間,就是暫存死區(qū)。 0x001 var 語(yǔ)法 var varname1 [= value1 [, varname2 [, varname3 ... [, varnameN]]]]; 使用 var a, b=2 // 聲明多個(gè)變量,可以賦值,也可以不賦值 a=1 // 先聲...

    scola666 評(píng)論0 收藏0
  • JS數(shù)據(jù)結(jié)構(gòu)0x004:鏈表

    摘要:概述這篇文章是說(shuō)鏈表,鏈表這種數(shù)據(jù)結(jié)構(gòu)非常普遍,有時(shí)候我們根本就沒(méi)有意識(shí)到用的是鏈表啥是鏈表鏈表就是用繩子連起來(lái)的酒瓶子,酒就是數(shù)據(jù),每個(gè)酒瓶子都連著下一個(gè)酒瓶子。 0x000 概述 這篇文章是說(shuō)鏈表,鏈表這種數(shù)據(jù)結(jié)構(gòu)非常普遍,有時(shí)候我們根本就沒(méi)有意識(shí)到用的是鏈表 0x001 啥是鏈表 鏈表就是用繩子連起來(lái)的酒瓶子,酒就是數(shù)據(jù),每個(gè)酒瓶子都連著下一個(gè)酒瓶子。 showImg(https...

    sumory 評(píng)論0 收藏0
  • java筆記0x002:操作符

    摘要:算數(shù)運(yùn)算符自增自減關(guān)系操作符邏輯操作符直接操作符三元運(yùn)算符字符串類型轉(zhuǎn)化轉(zhuǎn)化會(huì)被舍去轉(zhuǎn)化會(huì)被舍去 0x001 算數(shù)運(yùn)算符 int num1 = 1, num2 = 2; System.out.println(num1 + num2); // 3 System.out.println(num1 - num2); // -1 ...

    liaoyg8023 評(píng)論0 收藏0
  • SpringBoot入門(mén)0x002:URL 映射

    摘要:概述將某個(gè)請(qǐng)求映射到某個(gè)方法上這個(gè)注解可以加在某個(gè)或者某個(gè)方法上,如果加在上,則這個(gè)中的所有路由映射都將會(huì)加上這個(gè)前綴下面會(huì)有栗子,如果加在方法上,則沒(méi)有前綴下面也有栗子。 0x000 概述 將某個(gè)http請(qǐng)求映射到某個(gè)方法上 0x001 @RequestMapping 這個(gè)注解可以加在某個(gè)Controller或者某個(gè)方法上,如果加在Controller上,則這個(gè)Controller...

    jlanglang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<