日拱算法:用两个栈实现队列&包含min函数的栈

简介: 本篇带来【剑指offer】的两道初级算法题:冲~~

image.png

本篇带来【剑指offer】的两道初级算法题:冲~~

image.png


  • 用两个栈实现队列


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


示例 1:
输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]
示例 2:
输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]


解题思路:


这道题主要是明白栈是后进先出,队列是先进先出,那我们不妨设立一个入队栈和一个出队栈


入队直接压入入队栈,出队先检查出队栈是否为空,为空的话需要先把入队栈倒入出队栈,在进行出队操作,否则直接出队即可;


JavaScript 实现 如下:

var CQueue = function() {
    this.stackA = [];
    this.stackB = [];
};
/**
 * @param {number} value
 * @return {void}
 */
CQueue.prototype.appendTail = function(value) {
    this.stackA.push(value);
};
/**
 * @return {number}
 */
CQueue.prototype.deleteHead = function() {
    if (this.stackB.length) {
        return this.stackB.pop();
    } else {
        while (this.stackA.length) {
            this.stackB.push(this.stackA.pop());
        }
        if (!this.stackB.length) {
            return -1;
        } else {
            return this.stackB.pop();
        }
    }
};


  • 包含min函数的栈


定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.min();   --> 返回 -2.


解题思路:


审题:

  1. push(x) —— 将元素 x 推入栈中。
  2. pop() —— 删除栈顶的元素。
  3. top() —— 获取栈顶元素。
  4. getMin() —— 检索栈中的最小元素。
  5. 像常规apipush和pop这些操作,对栈进行了操作,直接输出null;
  6. top和min需要我们自己按照题目要求来排序栈,并输出元素


JavaScript 实现 如下:

/**
 * initialize your data structure here.
 */
var MinStack = function() {
    this.stack = []
};
/** 
 * @param {number} x
 * @return {void}
 */
MinStack.prototype.push = function(x) {
    this.stack.push(x)
};
/**
 * @return {void}
 */
MinStack.prototype.pop = function() {
  return  this.stack.pop()
};
/**
 * @return {number}
 */
MinStack.prototype.top = function() {
  return  this.stack[this.stack.length - 1]
};
/**
 * @return {number}
 */
MinStack.prototype.min = function() {
    let array = JSON.parse(JSON.stringify(this.stack))
     array =  array.sort((a,b)=>a - b)
    // console.log("array:", array,',stack:', this.stack)
    return array[0]
};


OK,以上便是本篇分享~



相关文章
|
6天前
|
存储 算法 前端开发
深入理解操作系统:进程调度与优先级队列算法
【9月更文挑战第25天】在操作系统的复杂世界中,进程调度是维持系统稳定运行的核心机制之一。本文将深入探讨进程调度的基本概念,分析不同的进程调度算法,并着重介绍优先级队列算法的原理和实现。通过简洁明了的语言,我们将一起探索如何优化进程调度,提高操作系统的效率和响应速度。无论你是计算机科学的初学者还是希望深化理解的专业人士,这篇文章都将为你提供有价值的见解。
|
7天前
|
XML JavaScript 前端开发
学习react基础(1)_虚拟dom、diff算法、函数和class创建组件
本文介绍了React的核心概念,包括虚拟DOM、Diff算法以及如何通过函数和类创建React组件。
15 2
|
2月前
|
缓存 算法 Java
刷算法,你应该知道的队列经典应用
文章介绍了队列的基本特性和经典应用,包括如何用队列实现栈、使用优先级队列解决Top K问题,并通过LeetCode题目示例展示了队列在算法实现中的应用。
刷算法,你应该知道的队列经典应用
|
2月前
|
算法
【Azure Developer】完成算法第4版书中,第一节基础编码中的数组函数 histogrm()
【Azure Developer】完成算法第4版书中,第一节基础编码中的数组函数 histogrm()
|
2月前
|
算法
【数据结构与算法】优先级队列
【数据结构与算法】优先级队列
13 0
|
2月前
|
存储 算法
【数据结构与算法】队列(顺序存储)
【数据结构与算法】队列(顺序存储)
15 0
|
2月前
|
算法
【算法】栈算法——逆波兰表达式求值
【算法】栈算法——逆波兰表达式求值
|
2月前
|
存储 算法
【算法】栈算法——最小栈
【算法】栈算法——最小栈
|
2月前
|
算法
【算法】栈算法——栈的压入、弹出序列
【算法】栈算法——栈的压入、弹出序列
|
3月前
|
算法 Python
`scipy.optimize`模块提供了许多用于优化问题的函数和算法。这些算法可以用于找到函数的最小值、最大值、零点等。
`scipy.optimize`模块提供了许多用于优化问题的函数和算法。这些算法可以用于找到函数的最小值、最大值、零点等。
下一篇
无影云桌面