成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(四)隊(duì)列和雙端隊(duì)列

jindong / 3090人閱讀

摘要:我們已經(jīng)學(xué)習(xí)了棧,隊(duì)列和棧非常類似,但是隊(duì)列遵循的是先進(jìn)先出原則的一組有序的項(xiàng),并從頂部移除元素,但是最新添加的元素必須排在隊(duì)列的末尾。恩,我們的前輩就提出了雙端隊(duì)列,允許用戶在隊(duì)首進(jìn)行添加和刪除元素的操作,隊(duì)尾也是一樣。

我們已經(jīng)學(xué)習(xí)了棧,隊(duì)列和棧非常類似,但是隊(duì)列遵循的是先進(jìn)先出(FIFO)原則的一組有序的項(xiàng),并從頂部移除元素,但是最新添加的元素必須排在隊(duì)列的末尾。在生活中也有隊(duì)列的應(yīng)用,比如我們在售票處排隊(duì)等票,隊(duì)頭的人先拿到票,就走了,而新來的人,就必須排在隊(duì)偉文明排隊(duì)。

隊(duì)列 創(chuàng)建隊(duì)列
class Queue {
  constructor() {
    this.count = 0;
    this.lowestCount = 0;//追蹤隊(duì)列的第一個元素
    this.items = {};
  }
向隊(duì)列添加元素
enqueue(element) {
    this.items[this.count] = element;
    this.count++;
  }

細(xì)節(jié)就是要注意到隊(duì)列只能在尾部添加元素

檢查隊(duì)列是否為空并獲取它的長度
size() {
    return this.count - this.lowestCount;
  };
isEmpty() {
    return this.size() === 0;
  };
從隊(duì)列移除元素
dequeue() {
    //判斷是否為空
    if (this.isEmpty()) {
      return undefined;
    }
    const result = this.items[this.lowestCount];
    delete this.items[this.lowestCount];
    this.lowestCount++;
    return result;
  }
查看隊(duì)列頭元素
 peek() {
    if (this.isEmpty()) {
      return undefined;
    }
    return this.items[this.lowestCount];
  }
清空隊(duì)列
clear() {
    this.items = {};
    this.count = 0;
    this.lowestCount = 0;
  }
創(chuàng)建toString方法
toString() {
    if (this.isEmpty()) {
      return "";
    }
    let objString = `${this.items[this.lowestCount]}`;
    for (let i = this.lowestCount + 1; i < this.count; i++) {
      objString = `${objString},${this.items[i]}`;
    }
    return objString;
  }

好的,我們的隊(duì)列到此就創(chuàng)建完畢了。但是,有些小伙伴就有疑問了,還是排隊(duì)情景,假如我已經(jīng)離開售票廳了,但是我還想再問些簡單問題,直接到前臺詢問,這就是隊(duì)首添加元素了,還有隊(duì)尾的人突然有事離開了,這也是刪除元素操作呀,那這個用隊(duì)列怎么實(shí)現(xiàn)。恩 ,我們的前輩就提出了雙端隊(duì)列,允許用戶在隊(duì)首進(jìn)行添加和刪除元素的操作,隊(duì)尾也是一樣。

雙端隊(duì)列 創(chuàng)建雙端隊(duì)列
class Deque {
  constructor() {
    this.count = 0;
    this.lowestCount = 0;
    this.items = {};
  }
添加操作 隊(duì)首添加元素
addFront(element) {
    if (this.isEmpty()) {//空隊(duì)列
      this.addBack(element);
    } else if (this.lowestCount > 0) {//之前被刪除,重新添加
      this.lowestCount--;
      this.items[this.lowestCount] = element;
    } else {
      for (let i = this.count; i > 0; i--) {
        this.items[i] = this.items[i - 1];
      }
      this.count++;
      this.items[0] = element;
    }
  }
隊(duì)尾添加元素
addBack(element) {
    this.items[this.count] = element;
    this.count++;
  }
刪除操作 隊(duì)首刪除元素
removeFront() {
    if (this.isEmpty()) {
      return undefined;
    }
    const result = this.items[this.lowestCount];
    delete this.items[this.lowestCount];
    this.lowestCount++;
    return result;
  }
隊(duì)尾刪除元素
removeBack() {
    if (this.isEmpty()) {
      return undefined;
    }
    this.count--;
    const result = this.items[this.count];
    delete this.items[this.count];
    return result;
  }
查詢操作 返回隊(duì)首元素
peekFront() {
    if (this.isEmpty()) {
      return undefined;
    }
    return this.items[this.lowestCount];
  }
返回隊(duì)尾元素
peekBack() {
    if (this.isEmpty()) {
      return undefined;
    }
    return this.items[this.count - 1];
  }
隊(duì)列的實(shí)踐 模擬擊鼓傳花游戲

情景:孩子們圍城一圈,把花傳遞給身邊的人,某一時刻停止,花在誰手上,誰就推出。重復(fù)這個操作,剩下的最后一個人就是勝利者。
代碼實(shí)現(xiàn):

function hotPotato(elementsList, num) {
  const queue = new Queue();
  const elimitatedList = [];

  for (let i = 0; i < elementsList.length; i++) {
    queue.enqueue(elementsList[i]);
  }

  while (queue.size() > 1) {
    for (let i = 0; i < num; i++) {
      queue.enqueue(queue.dequeue());
    }
    elimitatedList.push(queue.dequeue());
  }

  return {
    eliminated: elimitatedList,
    winner: queue.dequeue()
  };
}
回文檢查器

檢查一個詞組揮著字符串是否為回文。
代碼實(shí)現(xiàn):

function palindromeChecker(aString) {
  if (
    aString === undefined
    || aString === null
    || (aString !== null && aString.length === 0)
  ) {
    return false;
  }
  const deque = new Deque();
  const lowerString = aString.toLocaleLowerCase().split(" ").join("");
  let firstChar;
  let lastChar;

  for (let i = 0; i < lowerString.length; i++) {
    deque.addBack(lowerString.charAt(i));
  }

  while (deque.size() > 1) {
    firstChar = deque.removeFront();
    lastChar = deque.removeBack();
    if (firstChar !== lastChar) {
      return false;
    }
  }

  return true;
};

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/109968.html

相關(guān)文章

  • Java中的QueueDeque

    摘要:最小初始化容量。它作為堆棧隊(duì)列雙端隊(duì)列的操作和的操作是一致的,只是內(nèi)部的實(shí)現(xiàn)不同。根據(jù)元素內(nèi)容查找和刪除的效率比較低,為。但是接口有對應(yīng)的并發(fā)實(shí)現(xiàn)類類。 Queue接口的實(shí)現(xiàn)類 Queue接口作為隊(duì)列數(shù)據(jù)結(jié)構(gòu),java在實(shí)現(xiàn)的時候,直接定義了Deque接口(雙端隊(duì)列)來繼承Queue接口,并且只實(shí)現(xiàn)Deque接口。這樣java中的雙端隊(duì)列就囊括了隊(duì)列、雙端隊(duì)列、堆棧(Deque接口又定...

    zhangrxiang 評論0 收藏0
  • 重讀《學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)算法-第三版》- 第5章 隊(duì)列

    摘要:定場詩馬瘦毛長蹄子肥,兒子偷爹不算賊,瞎大爺娶個瞎大奶奶,老兩口過了多半輩,誰也沒看見誰前言本章為重讀學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法第三版的系列文章,主要講述隊(duì)列數(shù)據(jù)結(jié)構(gòu)雙端隊(duì)列數(shù)據(jù)結(jié)構(gòu)以及隊(duì)列相關(guān)應(yīng)用。 定場詩 馬瘦毛長蹄子肥,兒子偷爹不算賊,瞎大爺娶個瞎大奶奶,老兩口過了多半輩,誰也沒看見誰! 前言 本章為重讀《學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法-第三版》的系列文章,主要講述隊(duì)列數(shù)據(jù)結(jié)構(gòu)、...

    charles_paul 評論0 收藏0
  • Java 中的線程安全容器

    摘要:一同步容器常用的一些容器例如都不是線程安全的,最簡單的將這些容器變?yōu)榫€程安全的方式,是給這些容器所有的方法都加上關(guān)鍵字。為了降低哈希沖突的成本,在鏈表長度超過時,將鏈表轉(zhuǎn)換為紅黑樹。 一、同步容器 常用的一些容器例如 ArrayList、HashMap、都不是線程安全的,最簡單的將這些容器變?yōu)榫€程安全的方式,是給這些容器所有的方法都加上 synchronized 關(guān)鍵字。 Java 的...

    Seay 評論0 收藏0
  • LeetCode 之 JavaScript 解答第641題 —— 設(shè)計(jì)雙端隊(duì)列(Design Cir

    摘要:小鹿題目設(shè)計(jì)實(shí)現(xiàn)雙端隊(duì)列。你的實(shí)現(xiàn)需要支持以下操作構(gòu)造函數(shù)雙端隊(duì)列的大小為。獲得雙端隊(duì)列的最后一個元素。檢查雙端隊(duì)列是否為空。數(shù)組頭部刪除第一個數(shù)據(jù)。以上數(shù)組提供的使得更方便的對數(shù)組進(jìn)行操作和模擬其他數(shù)據(jù)結(jié)構(gòu)的操作,棧隊(duì)列等。 Time:2019/4/15Title: Design Circular DequeDifficulty: MediumAuthor: 小鹿 題目:Desi...

    Freeman 評論0 收藏0
  • Fork/Join框架簡介

    摘要:第二步執(zhí)行任務(wù)并合并結(jié)果。使用兩個類來完成以上兩件事情我們要使用框架,必須首先創(chuàng)建一個任務(wù)。用于有返回結(jié)果的任務(wù)。如果任務(wù)順利執(zhí)行完成了,則設(shè)置任務(wù)狀態(tài)為,如果出現(xiàn)異常,則紀(jì)錄異常,并將任務(wù)狀態(tài)設(shè)置為。 1. 什么是Fork/Join框架 Fork/Join框架是Java7提供了的一個用于并行執(zhí)行任務(wù)的框架, 是一個把大任務(wù)分割成若干個小任務(wù),最終匯總每個小任務(wù)結(jié)果后得到大任務(wù)結(jié)果的...

    W_BinaryTree 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<