【栈和队列】【打卡第151道】: 《剑指Offer》3刷:JZ30 包含min函数的栈

1、题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的 min 函数,输入操作时保证 pop、top 和 min 函数操作时,栈中一定有元素。

此栈包含的方法有:

push(value):将value压入栈中

pop():弹出栈顶元素

top():获取栈顶元素

min():获取栈中最小元素

2、算法分析

题目让求的是栈中最小的元素。

定义两个栈   

       1、StackData存储的是栈中的元素
       2、StackMin存储的是栈中最小的元素

题目中给了四个方法:

push:将元素添加到stackData中,stackMin的栈顶存储的是栈中最小的元素,所以每次添加元素的时候都需要和stackMin栈顶元素比较。当stackMin为空的话,添加元素。不空的话,比较一个node和stackMin.peek()栈顶元素的大小。node小的话,添加进去,node比较大的话,stackMin添加stackMin.peek栈顶元素。

pop:出栈元素

top:获取的是stackData的栈顶元素

min:获取栈stackData中的最小元素

3、代码实现

import java.util.Stack;


public class Solution {
    // StackData存储的是栈中的元素
    // StackMin存储的是栈中最小的元素
    Stack<Integer> stackData = new Stack<>();
    Stack<Integer> stackMin = new Stack<>();
    
    public void push(int node) {
        if(stackMin.isEmpty()){
            stackMin.push(node);
        }else{
            // stackMin最小元素大于node的话,说明node是最小的
            if(stackMin.peek() > node){
                stackMin.push(node);
            }else{
                // 在stackMin栈顶添加stackMin.peek()相同的元素
                stackMin.push(stackMin.peek());
            }
        }
        
        stackData.push(node);
    }
    
    public void pop() {
       if(!stackData.isEmpty()){
           stackData.pop();
       }
       if(!stackMin.isEmpty()){
           stackMin.pop();
       }
    }
    
    public int top() {
        if(!stackData.isEmpty()){
            return stackData.peek();
        }
        return -1;
    }
    
    public int min() {
        if(!stackMin.isEmpty()){
            return stackMin.peek();
        }
        return -1;
    }
}

おすすめ

転載: blog.csdn.net/Sunshineoe/article/details/121875680