【栈和队列】设计一个有getMin功能的栈

本文介绍了一种特殊栈的实现方式,该栈在基本的压栈和弹栈功能基础上,增加了返回栈中最小元素的功能,且所有操作时间复杂度均为O(1)。通过使用两个栈,一个用于常规操作,另一个用于跟踪最小值,确保了效率。

问题描述

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

要求:
1、pop、push、getMin操作的时间复杂度都是O(1)
2、设计的栈类型可以输用现成的栈结构

实现思路

思路大概就是用两个栈,一个栈用于自定义栈的弹出,压入,辅助栈用于存放最小值,当压入第一个栈的时候,会判断辅助栈是否为空,如果为空也压入,如果不为空,就比较,如果小于等于辅助栈的第一个值,就压入。弹出操作,如果第一个栈弹出的数和辅助栈的第一个数相等,也弹出辅助栈的第一个数,getMin()获取辅助栈的顶部的数据就好。

代码实现

import java.util.Stack;

public class Code_GetMinStack{
	public static class GetMinStack{
		private Stack<Integer> stackData;
		private Stack<Integer> stackMin;
		
		public GetMinStack() {
			stackData = new Stack<Integer>();
			stackMin  = new Stack<Integer>();
		}
		
		public void push(Integer obj) {
			stackData.push(obj);
			if(stackMin.isEmpty()) {
				stackMin.push(obj);
			}else {
				if(obj >= stackMin.peek()) {
					stackMin.push(stackMin.peek());
				}else {
					stackMin.push(obj);
				}
			}
		}
		
		public Integer pop() {
			if(stackData.isEmpty()) {
				throw new RuntimeException("stack is empty");
			}
			stackData.pop();
			return stackMin.pop();
		}
		
		public Integer getMin() {
			if(stackData.isEmpty()) {
				throw new RuntimeException("stack is empty");
			}
			return stackMin.peek();
		}
	}
	
	public static void main(String[] args) {
		GetMinStack getMinStack = new GetMinStack();
		getMinStack.push(10);
		System.out.println(getMinStack.getMin());	
		getMinStack.push(9);
		System.out.println(getMinStack.getMin());	
		getMinStack.push(8);
		System.out.println(getMinStack.getMin());	
		getMinStack.push(7);
		System.out.println(getMinStack.getMin());	
		getMinStack.push(6);
		System.out.println(getMinStack.getMin());
		getMinStack.push(5);
		System.out.println(getMinStack.getMin());
		getMinStack.pop();
		System.out.println(getMinStack.getMin());
		getMinStack.pop();
		System.out.println(getMinStack.getMin());
	}
}
六自由度机械臂ANN人工神经网络设计:正向逆向运动学求解、正向动力学控制、拉格朗日-欧拉法推导逆向动力学方程(Matlab代码实现)内容概要:本文档围绕六自由度机械臂的ANN人工神经网络设计展开,详细介绍了正向与逆向运动学求解、正向动力学控制以及基于拉格朗日-欧拉法推导逆向动力学方程的理论与Matlab代码实现过程。文档还涵盖了PINN物理信息神经网络在微分方程求解、主动噪声控制、天线分析、电动汽车调度、储能优化等多个工程与科研领域的应用案例,并提供了丰富的Matlab/Simulink仿真资源技术支持方向,体现了其在多学科交叉仿真与优化中的综合性价值。; 适合人群:具备一定Matlab编程基础,从事机器人控制、自动化、智能制造、电力系统或相关工程领域研究的科研人员、研究生及工程师。; 使用场景及目标:①掌握六自由度机械臂的运动学与动力学建模方法;②学习人工神经网络在复杂非线性系统控制中的应用;③借助Matlab实现动力学方程推导与仿真验证;④拓展至路径规划、优化调度、信号处理等相关课题的研究与复现。; 阅读建议:建议按目录顺序系统学习,重点关注机械臂建模与神经网络控制部分的代码实现,结合提供的网盘资源进行实践操作,并参考文中列举的优化算法与仿真方法拓展自身研究思路。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值