【每日算法】用两个栈实现一个队列

简介: 用两个栈实现一个队列

前言

leetcode 练练手

题目

剑指 Offer 09. 用两个栈实现队列 - 力扣(LeetCode)

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

示例 1:

输入:
["CQueue","appendTail","deleteHead","deleteHead","deleteHead"]
[[],[3],[],[],[]]
输出:[null,null,3,-1,-1]
复制代码

示例 2:

输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
复制代码

分析

老实说,这个题目拿到手里的时候着实有点懵,主要是这两个示例实在是太抽象了

这里先简单解释一下这个示例想表达什么

首先示例给了2个数组,一个数组代表相关的代码操作,一个数组表示相关操作所需要传递的参数,最后就是执行结果

["CQueue","appendTail","deleteHead","deleteHead","deleteHead"]
[[],[3],[],[],[]]

上下两个数组一一对应,依次执行

  • CQueue:初始化队列;不需要参数;没有输出结果,也就是 null
  • appendTail: 尾部插入数据;参数是3;插入操作不需要输出结果,也就是 null
  • deleteHead: 头部删除数据; 不需要参数;删除操作输出删除的元素,也就是 3
  • deleteHead:头部删除数据; 不需要参数;删除操作输出删除的元素,但是由于队列里已经没有数据,所以输出 -1

好了,示例的意思讲解完成,接下来我们要来做题了

思路

题目已经给了提示,用两个栈实现一个队列,那么我们的代码的所有功能一定是基于这两个栈实现的

  • 首先,什么是栈

栈是一种数据结构,特点是先进,后出(即只能在末尾进行操作)

如果用javascript的数组去模拟栈的话,那么就是一个只有push(从末尾添加元素)和pop(从末尾删除元素)2个方法的数组

  • 要实现的队列

队列这里题目也做了解释,就是只能在尾部插入appendTail,在头部删除deleteHead

理解完题目的目标之后,我们就来编写代码了

实现

var CQueue = function() {
    this.stack1 = []
    this.stack2 = []
};
/** 
 * @param {number} value
 * @return {void}
 */
CQueue.prototype.appendTail = function(value) {
    this.stack1.push(value)
};
/**
 * @return {number}
 */
CQueue.prototype.deleteHead = function() {
    if (this.stack2.length) {
        return this.stack2.pop()
    } else {
        while(this.stack1.length){
            this.stack2.push(this.stack1.pop())
        }
        if (this.stack2.length) {
            return this.stack2.pop()
        } else {
            return -1
        }
    }
};
/**
 * Your CQueue object will be instantiated and called as such:
 * var obj = new CQueue()
 * obj.appendTail(value)
 * var param_2 = obj.deleteHead()
 */



相关文章
|
2月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
73 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
2月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
39 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
1月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
2月前
|
算法
数据结构与算法二:栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式
这篇文章讲解了栈的基本概念及其应用,并详细介绍了中缀表达式转换为后缀表达式的算法和实现步骤。
59 3
|
2月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
25 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
3月前
|
存储 算法 前端开发
深入理解操作系统:进程调度与优先级队列算法
【9月更文挑战第25天】在操作系统的复杂世界中,进程调度是维持系统稳定运行的核心机制之一。本文将深入探讨进程调度的基本概念,分析不同的进程调度算法,并着重介绍优先级队列算法的原理和实现。通过简洁明了的语言,我们将一起探索如何优化进程调度,提高操作系统的效率和响应速度。无论你是计算机科学的初学者还是希望深化理解的专业人士,这篇文章都将为你提供有价值的见解。
|
2月前
|
算法 C++
【算法单调栈】 矩形牛棚(C/C++)
【算法单调栈】 矩形牛棚(C/C++)
|
4月前
|
缓存 算法 Java
刷算法,你应该知道的队列经典应用
文章介绍了队列的基本特性和经典应用,包括如何用队列实现栈、使用优先级队列解决Top K问题,并通过LeetCode题目示例展示了队列在算法实现中的应用。
刷算法,你应该知道的队列经典应用
|
4月前
|
算法
【数据结构与算法】优先级队列
【数据结构与算法】优先级队列
19 0
|
4月前
|
存储 算法
【数据结构与算法】队列(顺序存储)
【数据结构与算法】队列(顺序存储)
34 0