最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

如何用JS实现有getMin功能的栈

来源:动视网 责编:小采 时间:2020-11-27 19:33:30
文档

如何用JS实现有getMin功能的栈

如何用JS实现有getMin功能的栈:这篇文章主要介绍了如何用JS实现有getMin功能的栈,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下前言: 已经确定工作了~下周一正式入职,按理说应该是可以好好浪荡一周的,但是内心总是不安,总觉得自己这个水平真的太菜了,还是趁着现在
推荐度:
导读如何用JS实现有getMin功能的栈:这篇文章主要介绍了如何用JS实现有getMin功能的栈,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下前言: 已经确定工作了~下周一正式入职,按理说应该是可以好好浪荡一周的,但是内心总是不安,总觉得自己这个水平真的太菜了,还是趁着现在


这篇文章主要介绍了如何用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~谢谢~

文档

如何用JS实现有getMin功能的栈

如何用JS实现有getMin功能的栈:这篇文章主要介绍了如何用JS实现有getMin功能的栈,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下前言: 已经确定工作了~下周一正式入职,按理说应该是可以好好浪荡一周的,但是内心总是不安,总觉得自己这个水平真的太菜了,还是趁着现在
推荐度:
标签: 功能 实现 js
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top