《剑指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;
    }
}
上一篇下一篇

猜你喜欢

热点阅读