视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
如何用JS实现有getMin功能的栈
2020-11-27 19:33:30 责编:小采
文档


这篇文章主要介绍了如何用JS实现有getMin功能的栈,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

前言:

  已经确定工作了~下周一正式入职,按理说应该是可以好好浪荡一周的,但是内心总是不安,总觉得自己这个水平真的太菜了,还是趁着现在有自己的时间,赶紧多看看书,多学习学习吧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~谢谢~

下载本文
显示全文
专题