如何僅使用兩個棧在 JavaScript 中實現入隊和出隊?
在本教程中,我們將僅使用兩個棧來實現佇列。這是一個非常常見的面試問題,所以知道如何做是很好的。
演算法
步驟 1 - 我們有兩個棧,一個用於入隊,一個用於出隊。
步驟 2 - 我們透過推入入隊棧來入隊。
步驟 3 - 我們透過彈出出隊棧來出隊。
步驟 4 - 如果出隊棧為空,我們彈出入隊棧中的所有元素並將其推入出隊棧。
步驟 5 - 這會反轉順序,以便最舊的專案現在位於出隊棧的頂部。
實現
現在讓我們看看這如何在程式碼中工作。我們將建立一個具有兩個方法(入隊和出隊)的 Queue 類。
class Queue { constructor() { this.enqueueStack = []; this.dequeueStack = []; } enqueue(item) { this.enqueueStack.push(item); } dequeue() { if (this.dequeueStack.length === 0) { // move everything from enqueueStack to dequeueStack while (this.enqueueStack.length > 0) { const item = this.enqueueStack.pop(); this.dequeueStack.push(item); } } // dequeue from dequeueStack return this.dequeueStack.pop(); } }
在上面的程式碼中,我們有一個 Queue 類,它有兩個方法,enqueue 和 dequeue。
我們透過推入 enqueueStack 來入隊。
我們透過彈出 dequeueStack 來出隊。如果 dequeueStack 為空,我們將從 enqueueStack 彈出所有內容並將其推入 dequeueStack。這會反轉順序,以便最舊的專案現在位於 dequeueStack 的頂部。
示例
以下是使用僅兩個棧實現入隊和出隊的完整可執行程式碼。
<!doctype html> <html> <body> <h3> Implementing enqueue and dequeue using two stacks </h3> <div id="result1"></div> <div id="result2"></div> <div id="result3"></div> <script> class Queue { constructor() { this.enqueueStack = []; this.dequeueStack = []; } enqueue(item) { this.enqueueStack.push(item); } dequeue() { if (this.dequeueStack.length === 0) { // move everything from enqueueStack to dequeueStack while (this.enqueueStack.length > 0) { const item = this.enqueueStack.pop(); this.dequeueStack.push(item); } } // dequeue from dequeueStack return this.dequeueStack.pop(); } } // testing const queue = new Queue(); // enqueue three strings queue.enqueue("tutorials"); queue.enqueue("point"); queue.enqueue("JavaScript"); document.getElementById("result1").innerHTML = queue.dequeue(); // 1 document.getElementById("result2").innerHTML = queue.dequeue(); // 2 document.getElementById("result3").innerHTML = queue.dequeue(); // 3 </script> </body> </html>
使用兩個棧的一個好處是我們可以保持入隊棧排序。這樣,當我們將所有內容從入隊棧移動到出隊棧時,專案將已經按正確的順序排列。
使用兩個棧有一些缺點。
首先,它比使用單個棧實現的佇列佔用更多記憶體。
其次,它效率較低。每個入隊和出隊操作都需要兩個棧操作(推入和彈出)。
在本教程中,我們已經瞭解瞭如何僅使用兩個棧來實現佇列。這是一個非常常見的面試問題,所以知道如何做是很好的。
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP