博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【剑指Offer学习】【面试题21:包括min 函数的栈】
阅读量:7127 次
发布时间:2019-06-28

本文共 3025 字,大约阅读时间需要 10 分钟。

题目: 定义栈的数据结构,请在该类型中实现一个可以得到栈的最小素的min 函数。在该栈中。调用min、push 及pop的时间复杂度都是0(1)


解题思路:

把每次的最小元素(之前的最小元素和新压入战的元素两者的较小值)都保存起来放到另外一个辅助栈里

假设每次都把最小元素压入辅助栈, 那么就能保证辅助栈的栈顶一直都是最小元素.当最小元素从数据栈内被弹出之后,同一时候弹出辅助栈的栈顶元素,此时辅助栈的新栈顶元素就是下一个最小值。

代码实现:

public class Test21 {
/** * 定义栈的数据结构,请在该类型中实现一个可以得到校的最小元素的min函数。 * 在该栈中。调用pop、push 及min的时间复杂度都是0(1) * * @param
泛型參数 */ public static class StackWithMin
> {
// 数据栈,用于存放插入的数据 private Stack
dataStack; // 最小数位置栈,存放数据栈中最小的数的位置 private Stack
minStack; // 构造函数 public StackWithMin() { this.dataStack = new Stack<>(); this.minStack = new Stack<>(); } /** * 出栈方法 * @return 栈顶元素 */ public T pop() { // 假设栈已经为空。再出栈抛出异常 if (dataStack.isEmpty()) { throw new RuntimeException("The stack is already empty"); } // 假设有数据。最小数位置栈和数据栈必然是有同样的元素个数, // 两个栈同一时候出栈 minStack.pop(); return dataStack.pop(); } /** * 元素入栈 * @param t 入栈的元素 */ public void push(T t) { // 假设入栈的元素为空就抛出异常 if (t == null) { throw new RuntimeException("Element can be null"); } // 假设数据栈是空的,仅仅接将元素入栈,同一时候更新最小数栈中的数据 if (dataStack.isEmpty()) { dataStack.push(t); minStack.push(0); } // 假设数据栈中有数据 else { // 获取数据栈中的最小元素(未插入t之前的) T e = dataStack.get(minStack.peek()); // 将t入栈 dataStack.push(t); // 假设插入的数据比栈中的最小元素小 if (t.compareTo(e) < 0) { // 将新的最小元素的位置入最小栈 minStack.push(dataStack.size() - 1); } else { // 插入的元素不比原来的最小元素小,复制最小栈栈顶元素,将其入栈 minStack.push(minStack.peek()); } } } /** * 获取栈中的最小元素 * @return 栈中的最小元素 */ public T min() { // 假设最小数公位置栈已经为空(数据栈中已经没有数据了),则抛出异常 if (minStack.isEmpty()) { throw new RuntimeException("No element in stack."); } // 获取数据栈中的最小元素。而且返回结果 return dataStack.get(minStack.peek()); } } public static void main(String[] args) { StackWithMin
stack = new StackWithMin<>(); stack.push(3); System.out.println(stack.min() == 3); stack.push(4); System.out.println(stack.min() == 3); stack.push(2); System.out.println(stack.min() == 2); stack.push(3); System.out.println(stack.min() == 2); stack.pop(); System.out.println(stack.min() == 2); stack.pop(); System.out.println(stack.min() == 3); stack.push(0); System.out.println(stack.min() == 0); }}

执行结果:

这里写图片描写叙述

你可能感兴趣的文章
手动挂载分区
查看>>
键盘通知
查看>>
构建自己的词典库
查看>>
Graph Data Structures for Beginners
查看>>
@NotNull, @NotEmpty和@NotBlank
查看>>
使用jQuery的ajax实现同步获取返回值
查看>>
HBase 优化,columnFamily和qualifierColumn的设计原则
查看>>
java中Arraylist复制方法
查看>>
关于Kafka 的 consumer 消费者手动提交详解
查看>>
生成excle表格
查看>>
Maven基础篇之安装与目录结构
查看>>
hashMap 与hashtable
查看>>
JVM(四)垃圾回收的实现算法和执行细节
查看>>
input去空格
查看>>
spring boot项目打包成war并在tomcat上运行的步骤
查看>>
Node.js---01、初识NodeJS和Node.js的HTTP服务器搭建
查看>>
分享聚能聊"向代码致敬,寻找你的第83行"话题评论截图,得礼品咯!
查看>>
liunx 命令总结
查看>>
redis,Linux搭建
查看>>
门面模式
查看>>