算法通关村第四关——最大栈问题解析

力扣716,设计一个最大栈数据结构,既支持栈操作,又支持查找栈中最大元素。

分析

在最大栈的问题上,除了实现普通栈拥有的方法poppushtop外,还需要实现getMax方法来找到当前栈里的最大值。为了在最短事件内获得栈中的最大值,就不应该在执行getMax()方法时再去计算最小值,最好应该在push或者pop的过程中就应该计算好当前栈中的最大值。还应有popMax()检索并删除栈中最大值,并返回该值。

思路:基于栈后进先出的特点,那么在将一个数a压入栈中时,如果栈里已经存在b,c,d,那么无论这个栈之后执行什么操作,如果a在栈中,b,c,d就一定在栈中,因为在a被弹出之前,b,c,d不会被弹出,在操作过程中的任意一个时刻,只要a在栈顶,那么栈里的元素就一定是a,b,c,d。既然如此,我们就可以在每个新元素a入栈时,把当前栈中的最大值maxValue存储到另外一个辅助栈中,这样在后面的操作过程中只要栈顶元素为a,我们就可以用getMax()直接返回当前栈中最大值。在将栈顶元素pop时,我们同步将辅助栈中栈顶元素弹出,这样就可以保证只要辅助栈不为空,辅助栈里的栈顶元素始终都是当前栈的最大值。

在这里插入图片描述

将最大值存入辅助栈的算法步骤如下:

  • 当一个元素要入栈时,我们去当前辅助栈的栈顶的最大值与当前元素进行比较,得出最大值后将这个最大值压入辅助栈中。
  • 当一个元素要出栈时,我们把辅助栈的栈顶元素同步弹出。

删除栈里的最大值的算法步骤如下:

  • 创建一个缓冲栈,将原栈栈顶元素依次与辅助栈栈顶元素比较,如果小于辅助栈栈顶元素,就pop原栈顶元素并将其压入缓冲栈中保存,如果等于辅助栈栈顶元素就执行pop操作,同时弹出辅助栈栈顶元素。
  • 再将缓冲栈里的元素push回原栈,并返回最大值。

代码如下:

let MaxStack = function() {
	this.topIndex = -1;
	this.originStack = [];
	this.maxValueStack = [];
}

/**
 * @param {number} val
 * @return {void}
 * */
MaxStack.prototype.push(val) {
	this.originStack.push(val);
	let maxValue = (this.maxValueStack.length === 0 ? val : this.maxValueStack.at(this.topIndex))
	this.maxValueStack.push(Math.max(maxValue, val);
}

/**
 * @return {number}
 * */
MaxStack.prototype.pop() {
	this.maxValueStack.pop();
	return this.originStack.pop();
}

/**
 * @return {number}
 * */
MaxStack.prototype.top() {
	return this.originStack.at(topIndex);
}

/**
 * @return {number}
 * */
MaxStack.prototype.peekMax() {
	return this.maxValueStack.at(this.topIndex);
}

/**
 * @return {number}
 * */
MaxStack.prototype.popMax() {
	let maxValue = peekMax();
	const buffer = [];

	while (top() !== maxValue) buffer.push(pop());
	pop();
	while (buffer.length !== 0) {
		push(buffer.pop());
	}
	return maxValue;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值