自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

隊(duì)列實(shí)現(xiàn)棧&棧實(shí)現(xiàn)隊(duì)列

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

[[384374]]

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

前言

給你兩個(gè)棧你如何實(shí)現(xiàn)一個(gè)隊(duì)列,給你兩個(gè)隊(duì)列你如何實(shí)現(xiàn)一個(gè)棧。

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

問題分析

我們先來看下棧與隊(duì)列的特性:

  • 棧:最先加入的元素最后出
  • 隊(duì)列:最先加入的元素最先出

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

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

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

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

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

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

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

實(shí)現(xiàn)代碼

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

棧實(shí)現(xiàn)隊(duì)列

  • 創(chuàng)建StacksAndQueues類文件,聲明解決本文問題所需要的變量
  1. // 棧與隊(duì)列的相關(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.     } 
  • 實(shí)現(xiàn)入隊(duì)函數(shù)
  1. // 入隊(duì) 
  2.     enqueue(key: string | number): void { 
  3.         // 入棧1 
  4.         this.firstStacks.push(key); 
  5.     } 
  • 實(shí)現(xiàn)出隊(duì)函數(shù)
  1. // 出隊(duì) 
  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.    } 

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

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

 

隊(duì)列實(shí)現(xiàn)棧

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

 

代碼地址

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

  • StacksAndQueues.ts

 

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

2022-08-11 08:03:43

隊(duì)列

2024-02-02 08:25:34

隊(duì)列與棧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)算法隊(duì)列

2020-10-26 08:19:53

算法隊(duì)列

2020-10-28 10:10:03

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

2020-11-02 08:18:11

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

2023-12-28 09:55:08

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

2021-03-27 11:02:04

JavaScript隊(duì)列編程語言

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延遲隊(duì)列

2017-05-02 22:38:44

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

2023-10-10 13:39:53

Spring隊(duì)列優(yōu)化

2011-04-11 11:23:17

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

2023-12-05 13:46:09

解密協(xié)程線程隊(duì)列

2024-03-22 12:10:39

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

2024-07-16 18:05:19

延遲隊(duì)列MQRabbitMQ
點(diǎn)贊
收藏

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