」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 了解堆疊資料結構:在 JavaScript 中實作堆疊的逐步指南

了解堆疊資料結構:在 JavaScript 中實作堆疊的逐步指南

發佈於2024-11-17
瀏覽:966

堆栈是一种简单的线性数据结构,其工作原理就像一堆盘子?️。它遵循后进先出 (LIFO) 原则。将其视为一堆盘子:您只能添加或删除堆顶部的盘子。

为了更好的理解栈,让我们来一次短暂的想象之旅吧?.
想象一下您在一家高档餐厅??️,厨房工作人员正在为忙碌的夜晚做准备??‍?。在餐具区,有一大堆盘子等待使用。当食客到来、订单纷至沓来时,工作人员会从最上面的盘子中取出盘子。当添加干净的盘子时,它们会直接放在上面。这个简单的系统确保了位于堆栈底部的放置时间最长的盘子最后被使用,而顶部刚清洁过的盘子首先被使用✨。

Understanding Stack Data Structure: A Step-by-Step Guide to Implementing Stack in JavaScript

本质上,这就是堆栈数据结构的工作原理。堆栈是一种遵循后进先出 (LIFO) 原则的线性数据结构。就像我们的一堆盘子一样,添加到堆栈中的最后一个项目是第一个被删除的项目。

目录

在这个关于堆栈数据结构的综合教程中,我们将通过简单、适合初学者的方法探索以下主题:

  1. 什么是堆栈?
  2. 使用堆栈的优点和缺点
  3. 堆栈的实际应用
  4. 堆栈上的关键操作
  5. JavaScript 中的堆栈实现
  6. 结论


你准备好了吗?让我们深入探讨

Understanding Stack Data Structure: A Step-by-Step Guide to Implementing Stack in JavaScript

什么是堆栈?

堆栈是一种遵循后进先出(LIFO)原则的线性数据结构。这意味着最后添加到堆栈的元素将是第一个被删除的元素。将其想象为一摞书:您只能从书堆顶部添加或删除书籍。

使用堆栈的优点和缺点

在我们继续流程并编写一些代码之前,了解在哪里以及在哪里不使用堆栈是很有帮助的。下表详细给出了堆栈的明确优缺点。

优点 缺点
简单易实现 访问受限(只有顶部元素可以直接访问)
高效的后进先出 (LIFO) 操作 不适合元素的随机访问
入栈和出栈操作的恒定时间 O(1) 如果管理不当可能导致堆栈溢出
对于跟踪算法中的状态很有用(例如深度优先搜索) 不适合搜索或访问任意元素
帮助内存管理(例如,编程语言中的调用堆栈) 某些实现中的固定大小(基于数组的堆栈)
用于反转数据 可能需要在动态实现中调整大小,这可能成本高昂
自然支持递归算法 对于需要频繁遍历的大型数据集效率不高
帮助表达式求值和语法解析 如果在空堆栈上调用弹出操作,则可能发生下溢
在软件中的撤消机制中很有用 与更复杂的数据结构相比,功能有限
对于某些类型的数据组织(例如浏览器历史记录)有效 不适合需要类队列 (FIFO) 行为的问题

堆栈上的关键操作

可以在堆栈上执行的基本操作是:

  1. push():将一个元素添加到栈顶。
  2. pop():从堆栈中删除最顶层的元素。
  3. peek():返回栈顶元素,但不删除它。
  4. isEmpty():检查堆栈是否为空。
  5. size():返回栈中元素的数量。

堆栈的实际应用

堆栈在计算机科学和软件开发中无处不在。以下是一些常见的应用:

  1. 撤消功能:在文本编辑器或图形设计软件中,每个操作都被推入堆栈。当您点击“撤消”时,最近的操作将从堆栈中弹出并反转。

  2. 浏览器历史记录:当您访问新页面时,它将被推送到堆栈上。 “后退”按钮将当前页面从堆栈中弹出,显示上一页。

  3. 函数调用堆栈:在编程语言中,函数调用是使用堆栈来管理的。当一个函数被调用时,它被压入调用栈。当它返回时,它会弹出。

  4. 表达式计算:堆栈用于计算算术表达式,特别是后缀表示法的表达式。

  5. 回溯算法:在解决迷宫或解谜等问题中,堆栈可以跟踪所采取的路径,以便在需要时轻松回溯。

JavaScript 中的堆栈实现

现在,让我们用 JavaScript 实现一个 Stack。重要的是要知道在 JavaScript 中实现堆栈有不同的方法。实现堆栈的常见方法之一是使用数组,另一种方法是使用链表。在本文中,我们将使用链表(单链表)实现堆栈。

使用链表实现堆栈

我希望你还记得链表是如何工作的吗?您可能需要查看我们本系列之前的一篇文章中的链表实现。

现在,让我们开始使用单链表实现我们的堆栈。我们可以?

Understanding Stack Data Structure: A Step-by-Step Guide to Implementing Stack in JavaScript

首先,我们将创建一个 Node 类来表示我们的堆栈单个项目。

class Node {
  constructor(data) {
    this.data = data;
    this.next = null;
  }
}

然后,我们将创建一个 Stack 类来表示我们的堆栈。

class Stack {
  constructor() {
    this.top = null;
    this.size = 0;
  }

  // Stack Operations will be implemented here ?
}

推送操作

push操作将一个新元素添加到栈顶。它创建一个新的 StackNode,将其下一个指针设置为当前顶部,然后更新顶部以指向这个新节点。最后,它增加大小。

  // Push element to the top of the stack
  push(element) {
    const newNode = new Node(element);
    newNode.next = this.top;
    this.top = newNode;
    this.size  ;
  }

流行操作

出栈操作从堆栈中删除最顶层的元素。它首先检查堆栈是否为空。如果是,则返回错误消息。否则,它删除顶部元素,更新顶部指针到下一个节点,并减少大小。最后,它返回被删除的元素。

  // Remove and return the top element
  pop() {
    if (this.isEmpty()) {
      return "Stack is empty";
    }
    const poppedElement = this.top.data;
    this.top = this.top.next;
    this.size--;
    return poppedElement;
  }

窥视操作

peek 操作返回顶部元素而不删除它。它首先检查堆栈是否为空。如果是,则返回错误消息。否则,返回顶部元素的数据。

  // Return the top element without removing it
  peek() {
    if (this.isEmpty()) {
      return "Stack is empty";
    }
    return this.top.data;
  }

isEmpty操作

isEmpty 操作检查堆栈是否为空。如果堆栈为空则返回 true,否则返回 false。

  // Check if the stack is empty
  isEmpty() {
    return this.size === 0;
  }

获取大小操作

getSize操作返回堆栈的大小。它返回堆栈中元素的数量。

  // Return the size of the stack
  getSize() {
    return this.size;
  }

打印操作

打印操作打印堆栈。它返回顶部元素的数据。

  // Print the stack
  print() {
    let current = this.top;
    let result = "";
    while (current) {
      result  = current.data   " ";
      current = current.next;
    }
    console.log(result.trim());
  }

使用示例

// Usage example
const customStack = new CustomStack();
customStack.push(10);
customStack.push(20);
customStack.push(30);
console.log(customStack.pop()); // 30
console.log(customStack.peek()); // 20
console.log(customStack.getSize()); // 2
console.log(customStack.isEmpty()); // false
customStack.print(); // 20 10

在此实现中,我们使用链表(单链表)结构来表示我们的堆栈。每个元素都是一个节点,具有数据值和对下一个节点的引用。堆栈顶部始终是最近添加的节点。

结论

堆栈是计算机科学中的基本数据结构,遵循后进先出 (LIFO) 原则。它们用于各种应用程序,包括管理函数调用、实现撤消功能以及计算算术表达式。

在本教程中,我们介绍了堆栈的基础知识、使用它们的优缺点,以及它们在 JavaScript 中的实现(使用链表)。了解堆栈不仅仅是了解如何实现它们,还要认识到它们何时是解决问题的正确工具。

当您继续软件开发之旅时,您会发现堆栈是您解决问题的工具箱中不可或缺的工具。它们简单而强大,掌握它们将显着增强您设计高效算法和数据结构的能力。



保持更新和联系

确保您不会错过本系列的任何部分,并与我联系以更深入地讨论软件开发(Web、服务器、移动或抓取/自动化)、数据结构和算法以及其他令人兴奋的技术主题,关注我:

  • GitHub
  • 领英
  • X(推特)

敬请期待并快乐编码??‍??






          

            
  

            
                    
版本聲明 本文轉載於:https://dev.to/emmanuelayinde/understanding-stack-data-structure-a-step-by-step-guide-to-implementing-stack-in-javascript-3f62?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 為什麼我的 Tomcat 伺服器顯示「所需的幾個連接埠已在使用中」?
    為什麼我的 Tomcat 伺服器顯示「所需的幾個連接埠已在使用中」?
    Tomcat 伺服器連接埠衝突:解決錯誤「Several Ports required are Already in Use」嘗試在Tomcat 上啟動JSP 程式時Eclipse 中,使用者可能會遇到錯誤,指出Tomcat 所需的多個連接埠已在使用中。出現此問題的原因是存在另一個 Tomcat 實...
    程式設計 發佈於2024-11-17
  • 如何在 Java 中確定文件建立日期?
    如何在 Java 中確定文件建立日期?
    在Java 中確定文件創建日期:揭示文件元數據確定文件的創建日期可能是一條有價值的信息,尤其是組織和管理文件時。 Java 提供了存取此元資料的機制,只要底層檔案系統支援即可。 Java 中的檔案建立日期Java NIO(新輸入/輸出)提供用於擷取檔案元資料的選項,包括建立時間。透過利用 Basic...
    程式設計 發佈於2024-11-17
  • 如何在 PHP 和 MySQL 中同步時區?
    如何在 PHP 和 MySQL 中同步時區?
    在PHP 和MySQL 中同步時區您正在開發一個需要使用PHP date() 函數在MySQL 中儲存日期的應用程式。有必要使用 NOW() 在 MySQL 中比較這些日期來計算時間差異。但是,PHP date() 函數使用 PHP 中定義的時區,而 NOW() 使用 MySQL 伺服器中配置的時區...
    程式設計 發佈於2024-11-17
  • 我們如何在 C/C++ 中實作鋸齒狀數組?
    我們如何在 C/C++ 中實作鋸齒狀數組?
    理解C/C 中的交錯數組雖然交錯數組的概念(其中行可以有不同的長度)在標準C/ C ,有一些技術可以實現類似的功能。 在嘗試在C/C 中宣告交錯數組時,如圖所示:int jagged[][] = { {0,1}, {1,2,3} };編譯器出錯,突顯指定的要求除第一個維度外的所有維度的邊界。為了克服...
    程式設計 發佈於2024-11-17
  • 如何在 Sublime Text 2 中取得使用者輸入?
    如何在 Sublime Text 2 中取得使用者輸入?
    Sublime Text 2 中的使用者輸入使用者嘗試在Sublime Text 2 中輸入值時遇到困難,特別是在Python 中使用input() 或gets等函數時紅寶石。控制台不提示輸入,導致出現 EOFError 之類的錯誤。 此問題是由於 Sublime Text 2 缺乏控制台輸入的原生...
    程式設計 發佈於2024-11-17
  • 如何執行儲存在 MySQL 資料庫中的 PHP 程式碼?
    如何執行儲存在 MySQL 資料庫中的 PHP 程式碼?
    執行儲存在 MySQL 資料庫中的 PHP執行儲存在 MySQL 資料庫中的 PHP 為 Web 開發帶來了獨特的挑戰。要執行此操作,您可以使用 PHP 中內建的 eval() 函數。 eval() 函數eval() 函數計算給定的字串作為 PHP 程式碼。它執行解析後的程式碼,就像直接在腳本中編寫...
    程式設計 發佈於2024-11-17
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-17
  • 如何處理 PHP 8.1 中的回傳類型衝突?
    如何處理 PHP 8.1 中的回傳類型衝突?
    參考:返回類型衝突與#[\ReturnTypeWillChange] 屬性上下文:在PHP 8.1 中,指定返回類型方法變得更加普遍,導致與現有實現發生衝突。 問題:當方法的返回類型從相容類型更改為不相容型別或未指定時,以下棄用出現通知:Deprecated: Return type of [Met...
    程式設計 發佈於2024-11-17
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-11-17
  • How to Correctly Transfer Files Over Sockets in Java?
    How to Correctly Transfer Files Over Sockets in Java?
    Java file transfer over sockets involves converting files into byte arrays, sending them via the socket, and converting them back into files at the receiving end. To address issues encountered during implementation, this article provides corrected server
    程式設計 發佈於2024-11-17
  • 為什麼要使用「enableReaderMode」 API 將 NDEF 記錄寫入 NFC 標籤?
    為什麼要使用「enableReaderMode」 API 將 NDEF 記錄寫入 NFC 標籤?
    如何將NDEF 記錄寫入NFC 標籤將NDEF 記錄寫入NFC 標籤需要使用enableReaderMode API,該API 提供卓越的效能和與基於意圖的系統相比的可靠性。透過處理讀寫過程而不是依賴系統的預設行為,寫入失敗和卡片損壞的風險顯著降低。 使用enableReaderMode API的主...
    程式設計 發佈於2024-11-17
  • 以下是一些適合您文章內容的問題式標題:

* Mac OS X 上的 MySQLdb:為什麼我收到「未載入函式庫:libmysqlclient.16.dylib」?
* 如何修復「庫未載入:l
    以下是一些適合您文章內容的問題式標題: * Mac OS X 上的 MySQLdb:為什麼我收到「未載入函式庫:libmysqlclient.16.dylib」? * 如何修復「庫未載入:l
    Python:MySQLdb 和「未載入函式庫:libmysqlclient.16.dylib」在嘗試開發Python/Django 應用程式時,您在Mac OS X 10.6 上安裝MySQL-python 時遇到問題。儘管成功安裝MySQL,但導入MySQLdb 失敗,並顯示錯誤訊息「未載入庫:...
    程式設計 發佈於2024-11-17
  • 發現漸進式 Web 應用程式為您的下一個專案帶來的最大優勢
    發現漸進式 Web 應用程式為您的下一個專案帶來的最大優勢
    Progressive online Apps, or PWAs, are quickly changing the online development landscape. PWAs are becoming the ideal way to connect mobile application...
    程式設計 發佈於2024-11-17
  • 現代 C++ 實作中的 std::list::size() 真的是 O(1) 嗎?
    現代 C++ 實作中的 std::list::size() 真的是 O(1) 嗎?
    在現代實作 std::list::size() 真的是 O(n) 嗎? 最近,一些開發人員建議std::list::size() 具有線性時間複雜度 (O(n))。但是,根據 C 標準,複雜性沒有定義,並且可能會根據實現而變化。 在 C 標準的早期版本 (C 03) 中,建議 size() 操作具有...
    程式設計 發佈於2024-11-17
  • 如何在 Heroku 上建立對 ClearDB MySQL 資料庫的遠端存取?
    如何在 Heroku 上建立對 ClearDB MySQL 資料庫的遠端存取?
    在 Heroku 上遠端存取 ClearDB MySQL 資料庫遠端查詢 ClearDB MySQL 資料庫可以透過 MySQL 查詢瀏覽器等工具來實現。要建立連接,您需要以下資訊:獲取資料庫憑證和連接詳細資訊:導航至Heroku 網站並選擇“My應用程式。” 選擇與ClearDB 資料庫關聯的應用...
    程式設計 發佈於2024-11-17

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3