偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

隊列實現(xiàn)棧&棧實現(xiàn)隊列

開發(fā) 前端
給你兩個棧你如何實現(xiàn)一個隊列,給你兩個隊列你如何實現(xiàn)一個棧。本文就跟大家分享下這兩個問題的解決思路與實現(xiàn)過程,歡迎各位感興趣的開發(fā)者閱讀本文。

[[384374]]

本文轉(zhuǎn)載自微信公眾號「神奇的程序員K」,作者神奇的程序員K。轉(zhuǎn)載本文請聯(lián)系神奇的程序員K公眾號。

前言

給你兩個棧你如何實現(xiàn)一個隊列,給你兩個隊列你如何實現(xiàn)一個棧。

本文就跟大家分享下這兩個問題的解決思路與實現(xiàn)過程,歡迎各位感興趣的開發(fā)者閱讀本文。

問題分析

我們先來看下棧與隊列的特性:

  • 棧:最先加入的元素最后出
  • 隊列:最先加入的元素最先出

有關(guān)棧與隊列的詳細講解請移步我的另一篇文章:數(shù)據(jù)結(jié)構(gòu):棧與隊列

有了棧與隊列的理論基礎(chǔ)后,我們就可以利用其特性來分析問題了,我們先來看下如何用棧來實現(xiàn)隊列:

  • 我們的已知條件只有兩個棧,將這兩個棧進行標識:棧1、棧2
  • 執(zhí)行入隊操作時,我們元素放進棧1。
  • 執(zhí)行出隊操作時:
    • 把棧1的元素壓入棧2
    • 棧2頂部元素出棧

上述思路中,我們用棧1來存儲元素,我們知道棧的規(guī)則是先進后出,因此我們將棧1的元素壓入棧2后,將棧2元素出棧時,剛好符合隊列的特性。

接下來,我們來看下如何用隊列來實現(xiàn)棧:

  • 同樣的,我們的已知條件有兩個隊列,將這兩個隊列進行標識:隊列1,隊列2
  • 執(zhí)行入棧操作時,將元素放進隊列1
  • 執(zhí)行出棧操作時:
    • 如果隊列2為空,我們將隊列1中除隊首外的元素放進隊列2
    • 如果隊列2不為空,我們將隊列2的元素放進隊列1
    • 隊列1元素出隊

上述思路中,我們將元素都放入了隊列1,出棧時,我們只保留隊列1的隊首元素,其他元素全部放入了隊列2,隨后將隊列2的元素又放回了隊列1,最后將隊列1的元素出隊,經(jīng)過我們的這番倒騰后,剛好符合了棧的特性。

實現(xiàn)代碼

經(jīng)過上述分析,我們有了實現(xiàn)思路,接下來我們就將上述思路轉(zhuǎn)化為具體的代碼,下述代碼中將引入我們之前寫好的隊列與棧的實現(xiàn)代碼,對此不了解的開發(fā)者請移步我的另外兩篇文章:數(shù)組實現(xiàn)棧與對象實現(xiàn)棧、隊列與雙端隊列的實現(xiàn)

棧實現(xiàn)隊列

  • 創(chuàng)建StacksAndQueues類文件,聲明解決本文問題所需要的變量
  1. // 棧與隊列的相關(guān)操作 
  2. import Stack from "../../StackTest/lib/Stack.ts"
  3. import Queue from "../../QueueTest/lib/Queue.ts"
  4.  
  5. export default class StacksAndQueues { 
  6.     private firstStacks: Stack; 
  7.     private secondStacks: Stack; 
  8.     private firstQueues: Queue; 
  9.     private secondQueues: Queue; 
  10.  
  11.     constructor() { 
  12.         this.firstStacks = new Stack(); 
  13.         this.secondStacks = new Stack(); 
  14.         this.firstQueues = new Queue(); 
  15.         this.secondQueues = new Queue(); 
  16.     } 
  • 實現(xiàn)入隊函數(shù)
  1. // 入隊 
  2.     enqueue(key: string | number): void { 
  3.         // 入棧1 
  4.         this.firstStacks.push(key); 
  5.     } 
  • 實現(xiàn)出隊函數(shù)
  1. // 出隊 
  2.    dequeue() { 
  3.        while (!this.firstStacks.isEmpty()) { 
  4.            this.secondStacks.push(this.firstStacks.pop()); 
  5.        } 
  6.        if (!this.secondStacks.isEmpty()) { 
  7.            // 出棧2 
  8.            return this.secondStacks.pop(); 
  9.        } 
  10.        return null
  11.    } 

接下來,我們通過一個例子來驗證下上述代碼能否正常執(zhí)行:

  1. import StacksAndQueues from "./lib/StacksAndQueues.ts"
  2.  
  3. // 用棧實現(xiàn)隊列 
  4. const stacksAndQueues = new StacksAndQueues(); 
  5. stacksAndQueues.enqueue(3); 
  6. stacksAndQueues.enqueue(9); 
  7. stacksAndQueues.enqueue(12); 
  8. console.log("出隊", stacksAndQueues.dequeue()); 
  9. console.log("出隊", stacksAndQueues.dequeue()); 
  10. console.log("出隊", stacksAndQueues.dequeue()); 

 

隊列實現(xiàn)棧

  • 實現(xiàn)入棧函數(shù)
  1. // 入棧 
  2.    stackPush(key: string | number) { 
  3.        // 入隊1 
  4.        this.firstQueues.enqueue(key); 
  5.    } 
  • 實現(xiàn)出棧函數(shù)
  1. // 出棧 
  2.     stackPop() { 
  3.         if (this.firstQueues.isEmpty()) { 
  4.             return null
  5.         } 
  6.         // 隊列2為空 
  7.         if (this.secondQueues.isEmpty()) { 
  8.             while (this.firstQueues.size() != 1) { 
  9.                 // 將隊列1除隊首外的元素放進隊列2 
  10.                 this.secondQueues.enqueue(this.firstQueues.dequeue()); 
  11.             } 
  12.         } 
  13.  
  14.         // 隊列2不為空 
  15.         while (!this.secondQueues.isEmpty()) { 
  16.             // 將隊列2的元素放進隊列1 
  17.             this.firstQueues.enqueue(this.secondQueues.dequeue()); 
  18.         } 
  19.         // 隊列1出隊 
  20.         return this.firstQueues.dequeue(); 
  21.     } 
  • 接下來,我們通過一個例子來驗證下上述代碼能否正常執(zhí)行:
  1. // 隊列實現(xiàn)棧 
  2. stacksAndQueues.stackPush(3); 
  3. stacksAndQueues.stackPush(9); 
  4. stacksAndQueues.stackPush(12); 
  5. console.log("出棧", stacksAndQueues.stackPop()); 
  6. console.log("出棧", stacksAndQueues.stackPop()); 
  7. console.log("出棧", stacksAndQueues.stackPop()); 

 

代碼地址

本文實現(xiàn)代碼的完整地址如下:

  • StacksAndQueues.ts

 

責任編輯:武曉燕 來源: 神奇的程序員k
相關(guān)推薦

2022-08-11 08:03:43

隊列

2024-02-02 08:25:34

隊列與棧Python數(shù)據(jù)結(jié)構(gòu)

2021-09-08 09:52:34

語言

2015-09-10 08:46:15

Java面試題

2020-12-17 10:12:33

數(shù)據(jù)結(jié)構(gòu)算法隊列

2020-10-26 08:19:53

算法隊列

2020-10-28 10:10:03

Java單鏈表數(shù)據(jù)結(jié)構(gòu)

2020-11-02 08:18:11

隊列數(shù)據(jù)

2023-12-28 09:55:08

隊列數(shù)據(jù)結(jié)構(gòu)存儲

2021-03-27 11:02:04

JavaScript隊列編程語言

2012-03-29 15:15:49

Java

2020-08-10 14:46:30

JavaScriptStack

2011-11-09 14:59:37

LwIP協(xié)議棧

2023-09-05 15:48:14

RabbitMQ延遲隊列

2023-10-10 13:39:53

Spring隊列優(yōu)化

2011-04-11 11:23:17

隊列數(shù)據(jù)結(jié)構(gòu)

2017-05-02 22:38:44

前端開發(fā)JS事件循環(huán)機制

2017-04-12 10:02:21

Java阻塞隊列原理分析

2024-03-22 12:10:39

Redis消息隊列數(shù)據(jù)庫

2024-07-16 18:05:19

延遲隊列MQRabbitMQ
點贊
收藏

51CTO技術(shù)棧公眾號