日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
隊(duì)列實(shí)現(xiàn)棧&棧實(shí)現(xiàn)隊(duì)列

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

創(chuàng)新互聯(lián)建站自2013年創(chuàng)立以來,先為鄲城等服務(wù)建站,鄲城等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為鄲城企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

前言

給你兩個(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

本文題目:隊(duì)列實(shí)現(xiàn)棧&棧實(shí)現(xiàn)隊(duì)列
標(biāo)題URL:http://m.5511xx.com/article/dpdcpho.html