成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

[[384374]]

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

前言

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

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

問題分析

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

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

有關棧與隊列的詳細講解請移步我的另一篇文章:數(shù)據(jù)結構:棧與隊列

有了棧與隊列的理論基礎后,我們就可以利用其特性來分析問題了,我們先來看下如何用棧來實現(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)思路,接下來我們就將上述思路轉化為具體的代碼,下述代碼中將引入我們之前寫好的隊列與棧的實現(xiàn)代碼,對此不了解的開發(fā)者請移步我的另外兩篇文章:數(shù)組實現(xiàn)棧與對象實現(xiàn)棧、隊列與雙端隊列的實現(xiàn)

棧實現(xiàn)隊列

  • 創(chuàng)建StacksAndQueues類文件,聲明解決本文問題所需要的變量
  1. // 棧與隊列的相關操作 
  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
相關推薦

2022-08-11 08:03:43

隊列

2024-02-02 08:25:34

隊列與棧Python數(shù)據(jù)結構

2015-09-10 08:46:15

Java面試題

2021-09-08 09:52:34

語言

2020-12-17 10:12:33

數(shù)據(jù)結構算法隊列

2020-10-28 10:10:03

Java單鏈表數(shù)據(jù)結構

2020-10-26 08:19:53

算法隊列

2023-12-28 09:55:08

隊列數(shù)據(jù)結構存儲

2020-11-02 08:18:11

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

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)化

2017-05-02 22:38:44

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

2011-04-11 11:23:17

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

2017-04-12 10:02:21

Java阻塞隊列原理分析

2024-03-22 12:10:39

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

2024-07-16 18:05:19

延遲隊列MQRabbitMQ
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 琪琪午夜伦伦电影福利片 | 久久出精品 | 四季久久免费一区二区三区四区 | 色女人天堂 | 日本福利片 | 国产精品久久久久久 | 久草久草久草 | 欧美国产精品一区二区三区 | 精品国产91 | 亚洲激情在线观看 | 日韩在线一区二区三区 | 欧美福利 | 精品亚洲一区二区三区 | 黄网站涩免费蜜桃网站 | 久久婷婷国产麻豆91 | 久久蜜桃av| 欧美国产日韩在线观看成人 | 精品一区二区三区不卡 | 亚洲小说图片 | 91资源在线| 香蕉视频91 | 丁香综合 | 爱综合 | 国产精品日韩欧美一区二区 | 国产精品美女久久久久aⅴ国产馆 | 成人精品一区二区户外勾搭野战 | 草久视频 | 国产一区二区三区在线看 | 成人免费视频网址 | 亚洲欧美精品在线 | 日本精品免费在线观看 | 精品一区二区三区在线观看 | 一区二区三区四区在线视频 | 亚洲精选一区二区 | 精品成人在线 | 拍戏被cao翻了h承欢 | 国产亚洲精品久久久久久豆腐 | www.久久.com| 中文字幕日韩欧美一区二区三区 | 国产区精品在线观看 | 欧美日韩久久精品 |