算法(五):棧

一勿璃、棧(后進(jìn)先出)

JS中沒(méi)有棧,Array實(shí)現(xiàn)棧的所有功能
入棧:push
出棧:pop // 移除數(shù)組最后一項(xiàng),并返回它
stack[sack.length - 1]

棧的應(yīng)用場(chǎng)景
  • 十進(jìn)制轉(zhuǎn)二進(jìn)制
  • 函數(shù)調(diào)用堆棧
20. 有效的括號(hào) - 力扣(LeetCode) (leetcode-cn.com)

給定一個(gè)只包括 '('榛臼,')','{'恩静,'}'焕毫,'[',']' 的字符串 s 驶乾,判斷字符串是否有效邑飒。

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
    if(s.length % 2 === 1)return false;
    const stack = []
    for(let i = 0; i < s.length; i++){
        const c = s[i];
        if(c === '(' || c === '{' || c === '['){
            stack.push(c)
        } else {
            const t = stack[stack.length - 1];
            if((t === '(' && c === ')') || (t === '{' && c === '}' ) || (t === '[' && c === ']')) {
                stack.pop()
            } else {
                return false
            }
        }
    }
    return stack.length === 0   
}
150. 逆波蘭表達(dá)式求值 - 力扣(LeetCode) (leetcode-cn.com)

有效的算符包括 +、-级乐、疙咸、/ 。每個(gè)運(yùn)算對(duì)象可以是整數(shù)风科,也可以是另一個(gè)逆波蘭表達(dá)式撒轮。
輸入:tokens = ["2","1","+","3","
"]
輸出:9
解釋:該算式轉(zhuǎn)化為常見(jiàn)的中綴算術(shù)表達(dá)式為:((2 + 1) * 3) = 9

/**
 * @param {string[]} tokens
 * @return {number}
 */
var evalRPN = function(tokens) {
    const stack = []
    tokens.forEach(item => {
        if(isNaN(item)) { // 非數(shù)字
            const n2 = stack.pop(); // 把數(shù)字出棧
            const n1 = stack.pop();
            switch(item) {
                case "+":
                    stack.push(n1 + n2);
                    break;
                case "-":
                    stack.push(n1 - n2);
                    break;
                case "*":
                    stack.push(n1 * n2);
                    break;
                case "/":
                    stack.push(n1 / n2 | 0); // 不理解|運(yùn)算符作用
                    break;
            }
        } else { // 數(shù)字
            stack.push(Number(item))
        }
    })
    return stack[0]
};
71. 簡(jiǎn)化路徑 - 力扣(LeetCode) (leetcode-cn.com)

給你一個(gè)字符串 path ,表示指向某一文件或目錄的 Unix 風(fēng)格 絕對(duì)路徑 (以 '/' 開(kāi)頭)贼穆,請(qǐng)你將其轉(zhuǎn)化為更加簡(jiǎn)潔的規(guī)范路徑题山。
始終以斜杠 '/' 開(kāi)頭。
兩個(gè)目錄名之間必須只有一個(gè)斜杠 '/' 故痊。
最后一個(gè)目錄名(如果存在)不能 以 '/' 結(jié)尾顶瞳。
此外,路徑僅包含從根目錄到目標(biāo)文件或目錄的路徑上的目錄(即愕秫,不含 '.' 或 '..')慨菱。

/**
 * @param {string} path
 * @return {string}
 */
var simplifyPath = function(path) {
    // 將路徑以"/"切分
    const dir = path.split('/'), stack = []
    for(const item of dir) { // forEach中使用continue與break返回的結(jié)果會(huì)怎樣
        // '.'和""多個(gè),跳過(guò)
        if(item === '.' || item === '') continue
        if(item === '..') {
            stack.length > 0 ? stack.pop() : null
            continue
        } 
        stack.push(item)
    }
    return '/'+stack.join('/')
};
144. 二叉樹(shù)的前序遍歷 - 力扣(LeetCode) (leetcode-cn.com)

根左右

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var preorderTraversal = function(root) {
    const res = []
    const preOrder = (root) => {
        if(!root) return;
        res.push(root.val);
        preOrder(root.left);
        preOrder(root.right)
    };
    preOrder(root);
    return res
};
// 第2種
var preorderTraversal = function(root) {
    if(!root) return [];
    const stack = [root]
    const res = []
    while(stack.length) {
        const n = stack.pop()
        res.push(n.val)
        if(n.right) stack.push(n.right) // 后進(jìn)先出,先讓right進(jìn)
        if(n.left) stack.push(n.left)
    }
    return res
};
341. 扁平化嵌套列表迭代器 - 力扣(LeetCode) (leetcode-cn.com)【不理解】

輸入: [[1,1],2,[1,1]]
輸出: [1,1,2,1,1]

var NestedIterator = function(nestedList) {
    vals = [];
    const dfs = (nestedList) => {
        for (const nest of nestedList) {
            if (nest.isInteger()) {
                vals.push(nest.getInteger());
            } else {
                dfs(nest.getList());
            }
        }
    }
    dfs(nestedList);
};

NestedIterator.prototype.hasNext = function() {
    return vals.length > 0;
};

NestedIterator.prototype.next = function() {
    const val = vals[0];
    vals = vals.slice(1);
    return val;
};
94. 二叉樹(shù)的中序遍歷 - 力扣(LeetCode) (leetcode-cn.com)

左根右

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var inorderTraversal = function(root) {
    const res = []
    const inorderTraversal = (root) => {
        if(!root) return
        inorderTraversal(root.left)
        res.push(root.val)
        inorderTraversal(root.right)
    }
    inorderTraversal(root)
    return res
};
// 第2種
var inorderTraversal = function(root) {
    const res = []
    const stack = []
    while(root) { // 將左節(jié)點(diǎn)壓棧
        stack.push(root)
        root = root.left
    }
    while(stack.length) {
        let node = stack.pop() // 棧頂出棧
        res.push(node.val)
        node = node.right;
        while(node) {
            stack.push(node)
            node = node.left
        }
    }
    return res;
};
145. 二叉樹(shù)的后序遍歷 - 力扣(LeetCode) (leetcode-cn.com)

左右根

var postorderTraversal = function(root) {
    const res = []
    const postorder = (root) => {
        if(root) {
            postorder(root.left)
            postorder(root.right)
            res.push(root.val)
        }
    }
    postorder(root)
    return res
};
// 第2種
const postorderTraversal = (root) => {
    const res = [];
    const stack = [];  
    if(root) stack.push(root)
    while(stack.length > 0) {
        const node = stack.pop()
        res.unshift(node.val)
        if(node.left !== null) {
            stack.push(node.left)
        }
        if(node.right !== null) {
            stack.push(node.right)
        }
    }
    return res
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末戴甩,一起剝皮案震驚了整個(gè)濱河市符喝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌等恐,老刑警劉巖洲劣,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異课蔬,居然都是意外死亡囱稽,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)二跋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)战惊,“玉大人,你說(shuō)我怎么就攤上這事扎即⊥袒瘢” “怎么了况凉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)各拷。 經(jīng)常有香客問(wèn)我刁绒,道長(zhǎng),這世上最難降的妖魔是什么烤黍? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任知市,我火速辦了婚禮,結(jié)果婚禮上速蕊,老公的妹妹穿的比我還像新娘嫂丙。我一直安慰自己,他們只是感情好规哲,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布跟啤。 她就那樣靜靜地躺著,像睡著了一般唉锌。 火紅的嫁衣襯著肌膚如雪隅肥。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,584評(píng)論 1 312
  • 那天糊秆,我揣著相機(jī)與錄音武福,去河邊找鬼。 笑死痘番,一個(gè)胖子當(dāng)著我的面吹牛捉片,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播汞舱,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼伍纫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了昂芜?” 一聲冷哼從身側(cè)響起莹规,我...
    開(kāi)封第一講書(shū)人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎泌神,沒(méi)想到半個(gè)月后良漱,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡欢际,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年母市,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片损趋。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡患久,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蒋失,我是刑警寧澤返帕,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站篙挽,受9級(jí)特大地震影響荆萤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜铣卡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一观腊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧算行,春花似錦、人聲如沸苫耸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)褪子。三九已至量淌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嫌褪,已是汗流浹背呀枢。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留笼痛,地道東北人裙秋。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像缨伊,于是被迫代替她去往敵國(guó)和親摘刑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容