這篇文章為大家介紹棧(Stack)。
什么是棧?
棧全稱為堆棧,簡單來說就一種數據,特點是先進后出。在棧中只有兩種基本操作,插入-入棧和刪除-出站,記住棧只有一端可以進行入棧和出棧操作,我們將其稱為棧頂,另一端稱其為棧底;如下圖展示了棧這個數據結構:
JavaScript中的棧
其實JavaScript的棧并沒有數據類型,需要數組進行模擬,其中要知道的就是提供的push()和pop()選項,這樣也正好符合棧的特點,
示例代碼如下:
const stack = [] // 入棧 stack.push(1) stack.push(2) // 出棧 const v1 = stack.pop() // 2 const v2 = stack.pop() // 1
棧的應用場景
其實棧是算法和程序中最常用的輔助結構,先進后出場景中我們都可以見到棧的身影,比如:
函數調用堆棧
判斷字符串括號是否有效
接下來我們依次來看:
函數調用堆棧
JavaScript中的函數調用堆棧就是一個應用棧的一個典型例子,比如下面這段代碼:
function f1() {} function f2() { f1() } function f3() { f2() } f3()
如下圖:
執行過程如下:
調用函數f3(),將f3壓入堆棧;
在f3()中調用了f2(),將f2壓入堆棧;
在f2()中又調用了f1(),將f1壓入堆棧;
只有f1()運行完成才能繼續往下執行,所以f1()先出棧,以此類推。
有效的括號
有效的括號是力扣中的一個關于棧的算法題目,題目大意就是判斷給定字符串中的括號是否匹配,匹配返回true,否則返回false。
解題思路如下:
判斷字符串主要是判斷長度是否偶數,當時奇數時直接返回false,實現這主要是括號都是成對出現的;
新建一個棧;
遍歷字符串,遍歷到每一項時如果時左括號,將其壓入棧;如果是右括號,與棧頂對比,如果相匹配則出棧,不匹配則返回false。
實現代碼如下:
/** * @param {string} s * @return {boolean} */ var isValid = function(s) { if (s.length % 2 !== 0) 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 } } } // 如果為0表示全部匹配,有剩余則表示不匹配 return stack.length === 0 };
這里些的代碼雖然看起來簡單粗暴,但也非常實用。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/127818.html
摘要:包括了,新項目的人員架構熟悉,產品的架構學習,技術棧的了解,開發流程的熟悉。今天給大家介紹幾個快速了解產品技術棧的工具。希望可以幫助大家在接觸新項目的時候,可以快速了解到產品使用的技術棧。 起因 測試人員在介入到新項目的時候,總會有個一迷(xue)茫(xi)時期,里面會面臨很多的挑(ji)戰(yu)。包括了,新項目的人員架構熟悉,產品的架構學習,技術棧的了解,開發流程的熟悉。 如果想要...
摘要:讓你收獲滿滿碼個蛋從年月日推送第篇文章一年過去了已累積推文近篇文章,本文為年度精選,共計篇,按照類別整理便于讀者主題閱讀。本篇文章是今年的最后一篇技術文章,為了讓大家在家也能好好學習,特此花了幾個小時整理了這些文章。 showImg(https://segmentfault.com/img/remote/1460000013241596); 讓你收獲滿滿! 碼個蛋從2017年02月20...
摘要:本文是作者自己對中線程的狀態線程間協作相關使用的理解與總結,不對之處,望指出,共勉。當中的的數目而不是已占用的位置數大于集合番一文通版集合番一文通版垃圾回收機制講得很透徹,深入淺出。 一小時搞明白自定義注解 Annotation(注解)就是 Java 提供了一種元程序中的元素關聯任何信息和著任何元數據(metadata)的途徑和方法。Annotion(注解) 是一個接口,程序可以通過...
摘要:的出現解決了這尷尬的問題,非阻塞模式下,通過,我們的線程只為已就緒的通道工作,不用盲目的重試了。注意要將注冊到,首先需要將設置為非阻塞模式,否則會拋異常。 同步、異步、阻塞、非阻塞首先,這幾個概念非常容易搞混淆,但NIO中又有涉及,所以總結一下[1]。 同步:API調用返回時調用者就知道操作的結果如何了(實際讀取/寫入了多少字節)。 異步:相對于同步,API調用返回時調用者不知道操作...
閱讀 547·2023-03-27 18:33
閱讀 732·2023-03-26 17:27
閱讀 630·2023-03-26 17:14
閱讀 591·2023-03-17 21:13
閱讀 521·2023-03-17 08:28
閱讀 1801·2023-02-27 22:32
閱讀 1292·2023-02-27 22:27
閱讀 2178·2023-01-20 08:28