前言:

  已经确定工作了~下周一正式入职,按理说应该是可以好好浪荡一周的,但是内心总是不安,总觉得自己这个水平真的太菜了,还是趁着现在有自己的时间,赶紧多看看书,多学习学习吧orz所以把之前校招买的书,又翻出来看,都是很经典的书,但是因为自己找到工作之后就放纵了,几乎都放在书架上长灰,现在拿出来,一是希望自己能够养成一个学习的好习惯,即使在工作忙的时候,依然要挤出一点时间学习新的知识,不能得过且过,二是希望记录一下正在努力时的自己,也算是跟想要偷懒时的自己说,“喂,懒鬼,快点学习,不然你就真的对不起曾经努力的自己和以后懊悔的自己了”,嗯呢,闲话又说多了,接下来就正式开始咯~

正文:

  【题目】实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。

  【要求】1. pop、push、getMin操作的时间复杂度都为O(1)

      2. 设计的栈类型可以使用现成的栈结构

  【思路】定义一个stackData和一个stackMin,stackData用于存放实际数据,stackMin用于存放stackData中的最小值。重写pop和push方法,实现stackData和stackMin的数据同步。

  【实现】实现的方式有两种,详见代码。

 // 方法一
1 class MyStack {
constructor() {
this.stackData = [];
this.stackMin = [];
}
push() {
let args = arguments[0];
if (typeof args === 'number') {
//将新数据压入stackData栈中
this.stackData.push(args);
//判断是否将新数据压入stackMin栈中
if (this.stackMin.length > 0) {
//stackMin栈不空,需要判断当前数据是否小于等于stackMin的栈顶元素
let top = this.getMin();
if (args <= top) {
this.stackMin.push(args);
}
} else {
//stackMin栈空,则压入
this.stackMin.push(args);
}
}
}
pop() {
if (this.stackMin.length === 0) {
throw new Error('Stack is empty!');
}
let p = this.stackData.pop();
let top = this.getMin();
if (p === top) {
this.stackMin.pop();
}
return p;
}
getMin() {
if (this.stackMin.length === 0) {
throw new Error('Stack is empty!');
}
let len = this.stackMin.length;
return this.stackMin[len - 1];
}
} let s = new MyStack();
s.push(4);
s.push(2);
s.push(1);
console.log(s.getMin());
s.pop();
console.log(s.getMin());
s.pop();
s.pop();
s.pop(); //抛出异常
 //方法二
1 class MyStack {
constructor() {
this.stackData = [];
this.stackMin = [];
}
push() {
let args = arguments[0];
if (typeof args === 'number') {
//将新数据压入stackData栈中
this.stackData.push(args);
//判断是否将新数据压入stackMin栈中
if (this.stackMin.length > 0) {
//stackMin栈不空,需要判断当前数据是否小于等于stackMin的栈顶元素
let top = this.getMin();
if (args <= top) {
this.stackMin.push(args);
} else {
this.stackMin.push(top);
}
} else {
//stackMin栈空,则压入
this.stackMin.push(args);
}
}
}
pop() {
if (this.stackMin.length === 0) {
throw new Error('Stack is empty!');
}
let p = this.stackData.pop();
this.stackMin.pop();
return p;
}
getMin() {
if (this.stackMin.length === 0) {
throw new Error('Stack is empty!');
}
let len = this.stackMin.length;
return this.stackMin[len - 1];
}
} let s = new MyStack();
s.push(4);
s.push(2);
s.push(1);
console.log(s.getMin());
s.pop();
console.log(s.getMin());
s.pop();
s.pop();
// s.pop(); //抛出异常

后话:

  这个是计划写成一个系列,主要参考的就是左大神的《程序员代码面试指南——IT名企算法与数据结构题目最优解》,左大神在书里是用JAVA实现的,基本看得懂,但是因为我是用JS的,总觉得差点意思,反正也是学习,干脆就自己实现JS的写法,并且分享出来,也算是让我继续坚持的一个动力,当然,因为本人是菜鸟小白,肯定或多或少会出现一些问题,希望各位大牛们在嘲笑之余能够请不吝赐教~康桑阿米达~阿尼嘎多~Thx~谢谢~

常见面试算法题JS实现-设计一个有getMin功能的栈的更多相关文章

  1. 算法与数据结构题目的 PHP 实现:栈和队列 设计一个有 getMin 功能的栈

    刚入手了一本<程序员代码面试指南>,书中题目的代码都是 Java 实现的,琢磨着把这些代码用 PHP 敲一遍,加深印象. 题目:设计一个有 getMin 功能的栈 —— 实现一个特殊的栈, ...

  2. 《程序员代码面试指南》第一章 栈和队列 设计一个有getMin功能的栈

    题目 实现一个特殊的栈,在实现栈的基本功能上,再实现返回栈中最小的元素的操作 要求 1. pop.push.getMin操作时间复杂度都是O(1) 2. 设计的栈类型可以使用现成的栈结构 java代码 ...

  3. 设计一个有getMin功能的栈

    [说明]: 本文是左程云老师所著的<程序员面试代码指南>第一章中“设计一个有getMin功能的栈”这一题目的C++复现. 本文只包含问题描述.C++代码的实现以及简单的思路,不包含解析说明 ...

  4. 栈和队列----设计一个有getMin功能的栈

    设计一个有getMin功能的栈 设计一个具有getMin功能的栈,可以返回栈中的最小的元素,可以使用现有的栈的数据结构,要求pop/push/getMin操作的时间复杂度是O(1). package ...

  5. 栈和队列问题:设计一个有 getMin 功能的栈

    [知识点] 栈是一个先进后出(FILO-First In Last Out)的数据结构,队列是一种先进先出(FIFO-First In First Out)的数据结构. [题目] 实现一个特殊的栈,在 ...

  6. 常见面试算法题JS实现-仅用递归函数和栈操作逆序一个栈

    前言: 因为JAVA和JS语言特性的不同,有些东西在JAVA中可能需要一些技巧和手段才能实现的复杂程序,但是在JS中可能就是天然存在的,所以这套书里面的题目不会全部用JS去实现一遍,因为可能JS的实现 ...

  7. 左神算法书籍《程序员代码面试指南》——1_01设计一个有getMin功能的栈

    [题目] 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. [要求] 1.pop.push.getMin操作的时间复杂度都是O(1).2.设计的栈类型可以使用现成的栈结构. ...

  8. 设计一个有getMin功能的栈(2)

    题目: 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. 要求: 1.pop.push.getMin操作的时间复杂度都是O(1) 2.设计的栈类型可以输用现成的栈结构 解答 ...

  9. 设计一个有getMin功能的栈(1)

    题目: 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. 要求: 1.pop.push.getMin操作的时间复杂度都是O(1) 2.设计的栈类型可以输用现成的栈结构 解答 ...

随机推荐

  1. 铁乐学python_md5校验两个文件的一致性

    # 写一个函数,参数是两个文件的路径 # 返回的结果是T/F # 判断两个文件的md5值是否相同 import hashlib def diff_md5(file1,file2): def chick ...

  2. Sharepoint 2013/2010 登陆身份验证

    SharePoint 2013 and SharePoint 2010登陆身份验证格式: <IdentityClaim>:0<ClaimType><ClaimValueT ...

  3. Z :彻底了解指针数组,数组指针以及函数指针 [复

    原创 :彻底了解指针数组,数组指针以及函数指针 [复制链接] 00 roking 白手起家 帖子 60 主题 16 精华 0 可用积分 74 专家积分 0 在线时间 0 小时 注册时间 2003-10 ...

  4. Keepalived + haproxy双机高可用方案

    上一篇文章已经讲到了keepalived实现双机热备,且遗留了一个问题 master的网络不通的时候,可以立即切换到slave,但是如果只是master上的应用出现问题的时候,是不会 主动切换的. 上 ...

  5. Java基础知识强化107:DecimalFormat

    1. 引入: 如何控制输出数据的精度? >1. 使用Math.round方法 (1)Java如何把一个float(double)四舍五入到小数点后2位,4位,或者其它指定位数 ? 答:比如,如下 ...

  6. css中的相对定位与绝对定位的区别

    1.绝对定位 position: absolute;绝对定位:绝对定位是相对于元素最近的已定位的祖先元素(即是设置了绝对定位或者相对定位的祖先元素).如果元素没有已定位的祖先元素,那么它的位置则是相对 ...

  7. CF600E:Lomsat gelral(线段树合并)

    Description 一棵树有n个结点,每个结点都是一种颜色,每个颜色有一个编号,求树中每个子树的最多的颜色编号的和. Input 第一行一个$n$.第二行$n$个数字是$c[i]$.后面$n-1$ ...

  8. 【openjudge】【递推】例3.4 昆虫繁殖

    [题目描述] 科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强.每对成虫过x个月产y对卵,每对卵要过两个月长成成虫.假设每个成虫不死,第一个月只有一对成虫,且卵长成成虫后的第一个月不产卵 ...

  9. PHP类的静态(static)方法和静态(static)变量使用介绍

    PHP类的静态(static)方法和静态(static)变量使用介绍,学习php的朋友可以看下     在php中,访问类的方法/变量有两种方法: 1. 创建对象$object = new Class ...

  10. P1134 阶乘问题

    题目描述 也许你早就知道阶乘的含义,N阶乘是由1到N相乘而产生,如: 12! = 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x 11 x 12 = 479,001, ...