中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

怎么在JavaScript中使用棧

怎么在JavaScript中使用棧?很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供米東網(wǎng)站建設(shè)、米東做網(wǎng)站、米東網(wǎng)站設(shè)計(jì)、米東網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、米東企業(yè)網(wǎng)站模板建站服務(wù),十載米東做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

JavaScript的特點(diǎn)

1.JavaScript主要用來向HTML頁面添加交互行為。 2.JavaScript可以直接嵌入到HTML頁面,但寫成單獨(dú)的js文件有利于結(jié)構(gòu)和行為的分離。 3.JavaScript具有跨平臺(tái)特性,在絕大多數(shù)瀏覽器的支持下,可以在多種平臺(tái)下運(yùn)行。

先來看一道題

Leetcode 32 Longest Valid Parentheses (最長有效括號(hào))

給定一個(gè)只包含 '(' 和 ')' 的字符串,找出最長的包含有效括號(hào)的子串的長度。

示例 1:

輸入: "(()"
輸出: 2
解釋: 最長有效括號(hào)子串為 "()"

示例 2:

輸入: ")()())"
輸出: 4
解釋: 最長有效括號(hào)子串為 "()()"

這道題可以用動(dòng)態(tài)規(guī)劃來做,也能用簡潔明了的棧來解決。

什么是棧?

棧是一種先進(jìn)后出(LIFO)的有序集合,新添加的元素在棧頂,舊元素在棧底。

以下圖為例,1、2、3、4、5、6、7先后進(jìn)棧:

怎么在JavaScript中使用棧

創(chuàng)建棧

創(chuàng)建一個(gè)類來表示棧:

class Stack {
 // 初始化類,創(chuàng)建數(shù)組 items 存放入棧元素
 constructor() {
  this.items = [];
 }
 // push 方法進(jìn)行元素入棧(可同時(shí)入棧一或多個(gè)元素),無返回值
 push() {
  this.items.push(...arguments);
 }
 // pop 方法出棧一個(gè)元素,返回出棧元素
 pop() {
  return this.items.pop();
 }
 // peek 方法返回棧頂元素,不對棧本身做任何操作
 peek() {
  return this.items[this.items.length-1];
 }
 // size 方法返回棧內(nèi)元素個(gè)數(shù)
 size() {
  return this.items.length;
 }
 // isEmpty 方法查看棧是否為空,返回布爾值
 isEmpty() {
  return this.items.length == 0;
 }
 // clear 方法清空棧,無返回值
 clear() {
  this.items = [];
 }
 // print 方法打印棧內(nèi)元素
 print() {
  console.log(this.items.toString());
 }
}
 
// 測試 
let stack = new Stack();
stack.push(1,2,3,4);
stack.print(); // 1,2,3,4
stack.isEmpty(); // false
stack.size(); // 4
stack.pop(); // 4
stack.peek(); // 3
stack.clear();

注意

因?yàn)?JavaScript 的類內(nèi)暫時(shí)無法定義私有成員,所以可以在類外訪問到存儲(chǔ)棧元素的數(shù)組 items,這個(gè)操作是很危險(xiǎn)的。

stack.items; // [1, 2, 3, 4]

這時(shí)可以使用閉包和IIFE進(jìn)行避免,這是一個(gè)很無奈的辦法:

let Stack = (function () {
 // 使用 WeakMap 存儲(chǔ)數(shù)組(數(shù)組存放進(jìn)棧元素)
 let items = new WeakMap();
 class Stack {
  constructor() {
   items.set(this, []);
  }
  push() {
   items.get(this).push(...arguments);
  }
  // 其他方法
 }
 return Stack;
})();
 
let s = new Stack();
// 無法訪問到 items
s.items; // undefined

WeakMap: WeakMap是類似Map的鍵值對集合,但WeakMap的鍵是弱引用的,只要不存在引用,垃圾回收機(jī)制就會(huì)回收掉占用的內(nèi)存,相當(dāng)于自動(dòng)刪除,而不用手動(dòng)刪除。

用棧解題

思路:

變量start存放有效括號(hào)起始下標(biāo),maxLen存放最大長度;

棧只存放左括號(hào)的下標(biāo),遇到左括號(hào),將其下標(biāo)存入棧中;

遇到右括號(hào),若此時(shí)棧為空,跳過本次循環(huán)并更新start;若棧不為空,則棧頂元素出棧;

棧頂元素出棧后,若棧為空,則計(jì)算當(dāng)前下標(biāo)和start的距離,并更新maxLen;

棧頂元素出棧后,若棧不為空,則計(jì)算當(dāng)前下標(biāo)和棧頂存放的下標(biāo)的距離,并更新maxLen;

循環(huán)遍歷直至結(jié)束。

function test(str) {
 let stack = new Stack();
 let start = 0;
 let maxLen = 0;
 
 for(let i=0; i<str.length; i++) {
  // 如果是左括號(hào),下標(biāo)入棧
  if (str[i] == '(') {
   stack.push(i);
  } else {
   // 如果是右括號(hào)
   /* 棧內(nèi)為空,說明本次有效括號(hào)匹配已結(jié)束,跳過本次循環(huán)并更新 start */
   if (stack.isEmpty()) {
    start = i+1;
    continue;
   } else {
    // 棧內(nèi)不為空,則出棧一個(gè)左括號(hào)進(jìn)行匹配
    stack.pop();
    // 棧頂元素出棧后,棧為空
    if (stack.isEmpty()) {
     // 根據(jù)當(dāng)前下標(biāo)和 start 去更新 maxLen
     maxLen = Math.max(maxLen, i-start+1);
    } else {
     // 棧不為空,根據(jù)當(dāng)前下標(biāo)和棧頂存放的下標(biāo)去更新 maxLen
     maxLen = Math.max(maxLen, i-stack.peek());
    }
     
   }
  }  
 }
  
 return maxLen;
}
 
test('(()'); // 2
test(')()())'); // 4

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。

當(dāng)前名稱:怎么在JavaScript中使用棧
文章來源:http://www.rwnh.cn/article36/ghcjpg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站網(wǎng)站排名、建站公司、網(wǎng)站內(nèi)鏈、虛擬主機(jī)、微信公眾號(hào)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司
沙田区| 安平县| 六安市| 吉隆县| 昌吉市| 平利县| 玉树县| 雷波县| 金平| 天津市| 嫩江县| 剑阁县| 玉树县| 西乡县| 潞城市| 商城县| 永兴县| 富民县| 南陵县| 麻栗坡县| 徐水县| 延长县| 永清县| 马龙县| 宜春市| 延庆县| 永嘉县| 顺义区| 准格尔旗| 突泉县| 休宁县| 易门县| 牟定县| 台北县| 宁河县| 津南区| 湘乡市| 饶河县| 师宗县| 百色市| 平罗县|