引言
从本篇开始,会持续写一点关于笔试算法题目的博客,主要是一些笔试题中关于算法的部分,这些题目来自于网络以及书籍中。博文会进行题目的分析以及编码实现。之所以是想写这些,因为觉得算法是程序的灵魂,日常工作中大都是一些业务代码的实现,较少会涉及到算法部分。
一、题目
实现一个获取栈中最小值的栈,除了需要实现栈的基本功能,还需要可以获取栈中最小值以及最大值的功能。
二、分析
栈的基本功能就是先入后出,基本功能的话一个栈就可以实现了。但是如果需要另外实现获取栈中最小值以及最大值,则需要另外两个栈,一个栈存储栈中最小值,另一个栈存储最大值,而且每次出现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(); } }