假設理解 Big O 表示法。 JavaScript 中有範例。資料參考 Gayle Laakmann McDowell 的《Cracking the Coding Interview》
今天,我們將探討兩種基本的資料結構:堆疊和佇列。我們將深入研究它們的概念、用例,並使用經典和基於原型的方法在 JavaScript 中實現它們。
想像一下一堆煎餅 - 你最後放在上面的一個是你第一個吃的。這正是堆疊資料結構的工作原理。它遵循後進先出(LIFO)原則。
堆疊在涉及以下場景時特別有用:
class Stack { constructor() { this.items = []; } push(element) { this.items.push(element); } pop() { if (this.isEmpty()) { return "Stack is empty"; } return this.items.pop(); } peek() { if (this.isEmpty()) { return "Stack is empty"; } return this.items[this.items.length - 1]; } isEmpty() { return this.items.length === 0; } size() { return this.items.length; } clear() { this.items = []; } }
function Stack() { this.items = []; } Stack.prototype.push = function(element) { this.items.push(element); }; Stack.prototype.pop = function() { if (this.isEmpty()) { return "Stack is empty"; } return this.items.pop(); }; Stack.prototype.peek = function() { if (this.isEmpty()) { return "Stack is empty"; } return this.items[this.items.length - 1]; }; Stack.prototype.isEmpty = function() { return this.items.length === 0; }; Stack.prototype.size = function() { return this.items.length; }; Stack.prototype.clear = function() { this.items = []; };
現在,讓我們將焦點轉移到佇列。與堆疊不同,佇列遵循先進先出(FIFO)原則。想像一下音樂會場地的排隊——第一個到達的人就是第一個進入的人。
隊列常用於:
class Node { constructor(data) { this.data = data; this.next = null; } } class Queue { constructor() { this.start = null; this.end = null; this.size = 0; } enqueue(element) { const newNode = new Node(element); if (this.isEmpty()) { this.start = newNode; this.end = newNode; } else { this.end.next = newNode; this.end = newNode; } this.size++; } dequeue() { if (this.isEmpty()) { return "Queue is empty"; } const removedData = this.start.data; this.start = this.start.next; this.size--; if (this.isEmpty()) { this.end = null; } return removedData; } peek() { if (this.isEmpty()) { return "Queue is empty"; } return this.start.data; } isEmpty() { return this.size === 0; } getSize() { return this.size; } clear() { this.start = null; this.end = null; this.size = 0; } }
function Node(data) { this.data = data; this.next = null; } function Queue() { this.start = null; this.end = null; this.size = 0; } Queue.prototype.enqueue = function(element) { const newNode = new Node(element); if (this.isEmpty()) { this.start = newNode; this.end = newNode; } else { this.end.next = newNode; this.end = newNode; } this.size++; }; Queue.prototype.dequeue = function() { if (this.isEmpty()) { return "Queue is empty"; } const removedData = this.start.data; this.start = this.start.next; this.size--; if (this.isEmpty()) { this.end = null; } return removedData; }; Queue.prototype.peek = function() { if (this.isEmpty()) { return "Queue is empty"; } return this.start.data; }; Queue.prototype.isEmpty = function() { return this.size === 0; }; Queue.prototype.getSize = function() { return this.size; }; Queue.prototype.clear = function() { this.start = null; this.end = null; this.size = 0; };
堆疊和佇列都提供 O(1) O(1)
有效實現時,其核心操作(堆疊的壓入/彈出、佇列的入隊/出隊)的時間複雜度。這使得它們在特定用例中具有高效能。 它們都為許多常見的程式設計問題提供了優雅的解決方案,並構成了更複雜的資料結構和演算法的基礎。透過在 JavaScript 中理解並實現這些結構,您就能夠很好地解決各種 Leetcode/演算法問題? .以上是後進先出還是先進先出?堆疊/佇列指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!