队列实现栈&栈实现队列

前端 2023-07-05 17:29:38
59阅读

文中转载微信公众平台「奇妙的程序猿K」,创作者奇妙的程序猿K。转截文中请联络奇妙的程序猿K微信公众号。

序言

让你2个栈你怎样完成一个序列,让你2个序列你怎样完成一个栈。

文中就跟大伙儿共享下这两个难题的处理构思与完成全过程,热烈欢迎诸位很感兴趣的开发人员阅读文章文中。

问题分析

大家先看来下栈与序列的特点:

  • 栈:最开始添加的原素最终出
  • 序列:最开始添加的原素最开始出

相关栈与序列的详尽解读请移景我的另一篇文章:算法设计:栈与序列

拥有栈与序列的理论基础后,大家就可以运用其特点来分析问题了,大家先看来下怎样用栈来完成序列:

  • 大家的已经知道标准仅有2个栈,将这两个栈开展标志:栈1、栈2
  • 实行入队实际操作时,大家原素放入栈1。
  • 实行出队实际操作时:
    • 把栈1的原素压进栈2
    • 栈2顶端原素出栈

所述构思中,大家用栈1来储存原素,我们知道栈的标准是先进先出,因而大家将栈1的原素压进栈2后,将栈两元素出栈时,恰好合乎序列的特点。

下面,大家看来下怎样用序列来完成栈:

  • 一样的,大家的已经知道标准有两个序列,将这两个序列开展标志:序列1,序列2
  • 实行入栈实际操作时,将原素放入序列1
  • 实行出栈实际操作时:
    • 假如序列2为空,大家将序列1中除队首外的原素放入序列2
    • 假如序列2不以空,大家将序列2的原素放入序列1
    • 序列一元素出队

所述构思中,大家将原素都放进了序列1,出栈时,大家只保存序列1的队首原素,别的原素所有放进了序列2,接着将序列2的原素又放入了序列1,最终将序列1的原素出队,历经大家的这番折腾后,恰好合乎了栈的特点。

完成编码

历经所述剖析,大家拥有完成构思,下面大家就将所述构思转换为实际的编码,以下编码里将引进大家以前写好的序列与栈的完成编码,对于此事不了解的开发人员请移景我的此外几篇文章内容:二维数组完成栈与目标完成栈、序列与双端队列的完成

栈完成序列

  • 建立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.     } 
  • 完成入队涵数
 
  1. // 入队 
  2.     enqueue(key: string | number): void { 
  3.         // 入栈1 
  4.         this.firstStacks.push(key); 
  5.     } 
  • 完成出队涵数
 
  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.    } 

下面,大家根据一个事例来认证下所述编码可否一切正常实行:

 
  1. import StacksAndQueues from "./lib/StacksAndQueues.ts"
  2.  
  3. // 用栈完成序列 
  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()); 

序列完成栈

  • 完成入栈涵数
 
  1. // 入栈 
  2.    stackPush(key: string | number) { 
  3.        // 入队1 
  4.        this.firstQueues.enqueue(key); 
  5.    } 
  • 完成出栈涵数
 
  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.     } 
  • 下面,大家根据一个事例来认证下所述编码可否一切正常实行:
 
  1. // 序列完成栈 
  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()); 

编码详细地址

文中完成编码的详细详细地址以下:

  • StacksAndQueues.ts
the end
免责声明:本文不代表本站的观点和立场,如有侵权请联系本站删除!本站仅提供信息存储空间服务。