算法系列之栈和队列(一):设计一个栈,可以获取栈中最大值以及最小值

简介: 从本篇开始,会持续写一点关于笔试算法题目的博客,主要是一些笔试题中关于算法的部分,这些题目来自于网络以及书籍中。博文会进行题目的分析以及编码实现。之所以是想写这些,因为觉得算法是程序的灵魂,日常工作中大都是一些业务代码的实现,较少会涉及到算法部分。

引言

从本篇开始,会持续写一点关于笔试算法题目的博客,主要是一些笔试题中关于算法的部分,这些题目来自于网络以及书籍中。博文会进行题目的分析以及编码实现。之所以是想写这些,因为觉得算法是程序的灵魂,日常工作中大都是一些业务代码的实现,较少会涉及到算法部分。

一、题目

实现一个获取栈中最小值的栈,除了需要实现栈的基本功能,还需要可以获取栈中最小值以及最大值的功能。

二、分析

栈的基本功能就是先入后出,基本功能的话一个栈就可以实现了。但是如果需要另外实现获取栈中最小值以及最大值,则需要另外两个栈,一个栈存储栈中最小值,另一个栈存储最大值,而且每次出现push以及pop操作的时候都需要将最小值以及最大值进行更新。因为当出现push以及pop操作的时候,栈中的最小值以及最大值可能会发生变化。

三、代码实现

package com.algorithm;
import java.util.Stack;
import com.exception.ProgramException;
/**
 * @author taomeng
 * @Date 2018年9月2日
 * @Discription : 获取栈中的最小值
 */
public class NewStack {
    /**
     * 存储数据
     */
    private Stack<Integer> dataStack;
    /**
     * 存储栈中最小值
     */
    private Stack<Integer> minDataStack;
    /**
     * 存储栈中最大值
     */
    private Stack<Integer> maxDataStack;
    public NewStack(Stack<Integer> dataStack, Stack<Integer> minDataStack, Stack<Integer> maxDataStack) {
        this.dataStack = dataStack;
        this.minDataStack = minDataStack;
        this.maxDataStack = maxDataStack;
    }
    /**
     * 
     * 函数功能描述:栈的数据插入
     * @date 2018年9月2日上午11:17:15
     * @param newData void
     * @author taomeng
     */
    public void push(int newData) {
        if (minDataStack.isEmpty()) {
            minDataStack.push(newData);
        } else if (newData <= getMin()) {
            minDataStack.push(newData);
        }
        if (maxDataStack.isEmpty()) {
            maxDataStack.push(newData);
        } else if (newData >= getMax()) {
            maxDataStack.push(newData);
        }
        dataStack.push(newData);
    }
    /**
     * 
     * 函数功能描述:数据弹出
     * @date 2018年9月2日上午11:23:50
     * @return int
     * @author taomeng
     */
    public int pop() {
        if (dataStack.isEmpty()) {
            throw new ProgramException("stack is empty");
        }
        int value = dataStack.pop();
        if (value == getMin()) {
            minDataStack.pop();
        }
        if (value == getMax()) {
            maxDataStack.pop();
        }
        return value;
    }
    /**
     * 
     * 函数功能描述:获取栈中最小值
     * @date 2018年9月2日上午11:24:07
     * @return int
     * @author taomeng
     */
    public int getMin() {
        if (minDataStack.isEmpty()) {
            throw new ProgramException("stack is empty");
        }
        return minDataStack.peek();
    }
    /**
     * 
     * 函数功能描述:获取栈中最大值
     * @date 2018年9月2日下午12:00:58
     * @return int
     * @author taomeng
     */
    public int getMax() {
        if (maxDataStack.isEmpty()) {
            throw new ProgramException("stack is empty");
        }
        return maxDataStack.peek();
    }
}


相关文章
|
13天前
|
存储 算法 前端开发
深入理解操作系统:进程调度与优先级队列算法
【9月更文挑战第25天】在操作系统的复杂世界中,进程调度是维持系统稳定运行的核心机制之一。本文将深入探讨进程调度的基本概念,分析不同的进程调度算法,并着重介绍优先级队列算法的原理和实现。通过简洁明了的语言,我们将一起探索如何优化进程调度,提高操作系统的效率和响应速度。无论你是计算机科学的初学者还是希望深化理解的专业人士,这篇文章都将为你提供有价值的见解。
|
2月前
|
缓存 算法 Java
刷算法,你应该知道的队列经典应用
文章介绍了队列的基本特性和经典应用,包括如何用队列实现栈、使用优先级队列解决Top K问题,并通过LeetCode题目示例展示了队列在算法实现中的应用。
刷算法,你应该知道的队列经典应用
|
2月前
|
算法
【数据结构与算法】优先级队列
【数据结构与算法】优先级队列
14 0
|
2月前
|
存储 算法
【数据结构与算法】队列(顺序存储)
【数据结构与算法】队列(顺序存储)
17 0
|
2月前
|
算法
【算法】栈算法——逆波兰表达式求值
【算法】栈算法——逆波兰表达式求值
|
2月前
|
存储 算法
【算法】栈算法——最小栈
【算法】栈算法——最小栈
|
2月前
|
算法
【算法】栈算法——栈的压入、弹出序列
【算法】栈算法——栈的压入、弹出序列
|
3月前
|
算法 Python
`scipy.optimize`模块提供了许多用于优化问题的函数和算法。这些算法可以用于找到函数的最小值、最大值、零点等。
`scipy.optimize`模块提供了许多用于优化问题的函数和算法。这些算法可以用于找到函数的最小值、最大值、零点等。
|
3月前
|
算法 Java 开发者
Java面试题:Java内存探秘与多线程并发实战,Java内存模型及分区:理解Java堆、栈、方法区等内存区域的作用,垃圾收集机制:掌握常见的垃圾收集算法及其优缺点
Java面试题:Java内存探秘与多线程并发实战,Java内存模型及分区:理解Java堆、栈、方法区等内存区域的作用,垃圾收集机制:掌握常见的垃圾收集算法及其优缺点
30 0
|
3月前
|
存储 算法 Java
Java面试题:解释JVM的内存结构,并描述堆、栈、方法区在内存结构中的角色和作用,Java中的多线程是如何实现的,Java垃圾回收机制的基本原理,并讨论常见的垃圾回收算法
Java面试题:解释JVM的内存结构,并描述堆、栈、方法区在内存结构中的角色和作用,Java中的多线程是如何实现的,Java垃圾回收机制的基本原理,并讨论常见的垃圾回收算法
31 0