《剑指offer》(二十)-包含min函数的栈(java)
2019-12-30 本文已影响0人
鼠小倩
包含min函数的栈
考点:栈
题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
代码格式
import java.util.Stack;
public class Solution {
public void push(int node) {
}
public void pop() {
}
public int top() {
}
public int min() {
}
}
测试用例
image.png知识点
java中的栈Stack的基本使用和应用
栈定义 栈是一种只能在一端进行插入或删除操作的线性表。(先进后出表)
java中的Stack继承Vector
实例化 Stack stack=new Stack();
基本使用:
判断是否为空stack.empty()
取栈顶值(不出栈)stack.peek()
进栈stack.push(Object);
出栈stack.pop();
解题一-两个栈
1.思路
栈stack1保存数据,辅助栈stack2保存依次入栈最小的数
stack1中依次入栈,6,5,8,4,3,9
stack2依次入栈,6,5,5,4,3,3
每次入栈的时候,如果入栈的元素比stack2中的栈顶元素小或等于则入栈,否则不入栈。
2.代码
import java.util.Stack;
public class Solution {
private Stack<Integer> stack1=new Stack<>();
private Stack<Integer> stack2=new Stack<>();
public void push(int node) {
stack1.push(node);
if(stack2.empty()){
stack2.push(node);
}else{
if(node <= stack2.peek()){
stack2.push(node);
}else{
stack2.push(stack2.peek());
}
}
}
public void pop() {
stack1.pop();
stack2.pop();
}
public int top() {
return stack1.peek();
}
public int min() {
return stack2.peek();
}
}
解题二-一个栈
1.思路
在栈中需要保留冗余的曾经的最小值,这样能够比较方便到找到当前的此小值
2.代码
//https://www.nowcoder.com/questionTerminal/4c776177d2c04c2494f2555c9fcc1e49?answerType=1&f=discussion
//牛客网
import java.util.Stack;
public class Solution {
//需要这样写来初始化stack,不然会报空指针push的时候
private static Stack<Integer> stack = new Stack<Integer>();
private static Integer minElement = Integer.MAX_VALUE;
public void push(int node) {
if(stack.empty()){
minElement = node;
stack.push(node);
}else{
if(node <= minElement){
stack.push(minElement);//在push更小的值时需要保留在此值之前的最小值
minElement = node;
}
stack.push(node);
}
}
public void pop() {
//增加最后一个元素以及栈为空时候的检测
if(stack.size() == 0)return;
if( minElement == stack.peek()){
if(stack.size() >1){
stack.pop();
minElement = stack.peek();
}else{
minElement = Integer.MAX_VALUE;
}
}
stack.pop();
}
public int top() {
return stack.peek();
}
public int min() {
return minElement;
}
}