常见面试算法题JS实现-设计一个有getMin功能的栈

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

 

正文:

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

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

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

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

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

// 方法一
1
class MyStack { 2 constructor() { 3 this.stackData = []; 4 this.stackMin = []; 5 } 6 push() { 7 let args = arguments[0]; 8 if (typeof args === 'number') { 9 //将新数据压入stackData栈中 10 this.stackData.push(args); 11 //判断是否将新数据压入stackMin栈中 12 if (this.stackMin.length > 0) { 13 //stackMin栈不空,需要判断当前数据是否小于等于stackMin的栈顶元素 14 let top = this.getMin(); 15 if (args <= top) { 16 this.stackMin.push(args); 17 } 18 } else { 19 //stackMin栈空,则压入 20 this.stackMin.push(args); 21 } 22 } 23 } 24 pop() { 25 if (this.stackMin.length === 0) { 26 throw new Error('Stack is empty!'); 27 } 28 let p = this.stackData.pop(); 29 let top = this.getMin(); 30 if (p === top) { 31 this.stackMin.pop(); 32 } 33 return p; 34 } 35 getMin() { 36 if (this.stackMin.length === 0) { 37 throw new Error('Stack is empty!'); 38 } 39 let len = this.stackMin.length; 40 return this.stackMin[len - 1]; 41 } 42 } 43 44 let s = new MyStack(); 45 s.push(4); 46 s.push(2); 47 s.push(1); 48 console.log(s.getMin()); 49 s.pop(); 50 console.log(s.getMin()); 51 s.pop(); 52 s.pop(); 53 s.pop(); //抛出异常

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwwpss.html