问题:实现一个栈,带有出栈(pop),入栈(push),取最小元素(getMin)三个方法。要保证这三个方法的时间复杂度都是O(1)。
1.使用 两个栈实现
public class MinStackWithStack { public static void main(String[] args) { Student s = new Student(); s.stuAge = 28; s.stuName ="baoyou"; Student s2 = new Student(); s2.stuAge = 1; s2.stuName ="baoyuqi"; MinStack<Student> ms = new MinStack(); ms.push(s); ms.push(s2); Student min = ms.getMin(); System.out.println(min); } } class MinStack<T extends Comparable<T>>{ Stack<T> stack; Stack<T> minStack; public void push(T t){ T obj = null; if (stack == null) { stack = new Stack<T>(); minStack = new Stack<T>(); minStack.push(t); }else{ obj = minStack.peek(); if(t.compareTo(obj) >= 0){ minStack.push(obj); }else{ minStack.push(t); } } stack.push(t); } public T pop(){ if (stack == null || stack.empty()) { return null; } return stack.pop(); } public T getMin(){ if (minStack == null || minStack.empty()) { return null; } return minStack.peek(); } } class Student implements Comparable<Student>{ public String stuName; public int stuAge; @Override public int compareTo(Student s) { if (this.stuAge < s.stuAge ) { return -1; }else if(this.stuAge > s.stuAge ){ return 1; } return 0; } @Override public String toString() { return FastJsonUtils.toJSONString(this).toString(); } }
2.使用 链表实现 栈
public class MinStackUseNodeDemo { public static void main(String[] args) { Student s = new Student(); s.stuAge = 28; s.stuName = "baoyou"; Student s2 = new Student(); s2.stuAge = 1; s2.stuName = "baoyuqi"; Student s3 = new Student(); s3.stuAge = 29; s3.stuName = "baopan"; MinStackUseNode<Student> msun = new MinStackUseNode<Student>(); msun.push(s); msun.push(s2); Student min = msun.getMin(); System.out.println(min); } } class MinStackUseNode<T extends Comparable<T>> { public MinStackElem<T> top; public <T extends Comparable<T>> void push(T obj) { if (top == null) { top = new MinStackElem(obj, obj, null); } else { T min = null; if (obj.compareTo((T) top.min) >= 0) { min = (T) top.min; } else { min = obj; } MinStackElem minStackElem = new MinStackElem(obj, min, top); top = minStackElem; } } public T pop() { if (top == null) { return null; } T t = top.data; top = top.next; return t; } public T getMin() { if (top == null) { return null; } T t = top.min; return t; } } class MinStackElem<T extends Comparable<T>> { public T data; public T min; public MinStackElem next; // public MinStackNode(){} public MinStackElem(T data, T min, MinStackElem next) { this.data = data; this.min = min; this.next = next; } }
3.使用数组
public interface IMinMaxStack<T> { public T pop(); public void push(T t); public T getMin(); public T getMax(); public int getLength(); }
public class MinMaxStack implements IMinMaxStack<Integer> { private static int maxLength = 5; private static int [] data= new int[maxLength]; private static int [] mins= new int[maxLength]; private static int [] maxs= new int[maxLength]; private static int size = 0; private static int current = 0; private static int total = 0; private void growing(){ if (current >= maxLength / 4 * 3 ) { maxLength = (maxLength *3)/2 + 1; data = Arrays.copyOf(data, maxLength); mins = Arrays.copyOf(mins, maxLength); maxs = Arrays.copyOf(maxs, maxLength); } } @Override public Integer pop() { total --; if (current >= 0) { int temp = data[current-1] ; current --; return temp; } return null; } @Override public void push(Integer t) { total ++; growing(); data[current] = t; if(current == 0){ mins[current] = t; maxs[current] = t; }else{ if (mins[current-1] >= t) { mins[current] = t; }else{ mins[current] = mins[current-1]; } if (maxs[current-1] <= t) { maxs[current] = t; }else{ maxs[current] = maxs[current-1]; } } current ++; } @Override public Integer getMin() { int temp = mins[current]; return temp; } @Override public Integer getMax() { int temp = maxs[current]; return temp; } @Override public int getLength() { return total; } public static void main(String[] args) { MinMaxStack ms = new MinMaxStack(); ms.push(6); ms.push(2); ms.push(7); ms.push(1); ms.push(5); ms.push(3); System.out.println("current\tlength\tpop\tmin\tmax"); System.out.println(ms.current+"\t"+ms.getLength()+"\t"+ms.pop()+"\t"+ ms.getMin()+"\t"+ ms.getMax()); System.out.println(ms.current+"\t"+ms.getLength()+"\t"+ms.pop()+"\t"+ ms.getMin()+"\t"+ ms.getMax()); System.out.println(ms.current+"\t"+ms.getLength()+"\t"+ms.pop()+"\t"+ ms.getMin()+"\t"+ ms.getMax()); System.out.println(ms.current+"\t"+ms.getLength()+"\t"+ms.pop()+"\t"+ ms.getMin()+"\t"+ ms.getMax()); System.out.println(ms.current+"\t"+ms.getLength()+"\t"+ms.pop()+"\t"+ ms.getMin()+"\t"+ ms.getMax()); System.out.println(ms.current+"\t"+ms.getLength()+"\t"+ms.pop()+"\t"+ ms.getMin()+"\t"+ ms.getMax()); } }
捐助开发者
在兴趣的驱动下,写一个免费
的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(支持支付宝和微信 以及扣扣群),没钱捧个人场,谢谢各位。
个人主页:http://knight-black-bob.iteye.com/
谢谢您的赞助,我会做的更好!
相关推荐
12. 最小栈:这是一个常见的数据结构问题,要求设计一种数据结构,可以实现最小栈的功能。 13. 设计推特:这是一个系统设计题,要求设计一个社交媒体平台,能够实现推文的发布、检索和管理等功能。 14. 电话目录...
6. 最小栈(Min Stack):设计一个栈,能够在 O(1) 时间内获取最小值。难度:简单 7. 删除字符串中的所有相邻重复项(Remove All Adjacent Duplicates in String):给定一个字符串,删除所有相邻重复的字符。难度:...
2. **最小栈设计**:为了实现getMin操作,我们需要考虑如何在每次push元素时更新最小值,同时在pop时保持最小值的正确性。常见的解决方案是在主栈外额外维护一个辅助栈,用来记录当前栈中的最小值。 3. **push操作*...
第155题名为“最小栈”,是一道设计数据结构的问题,它要求我们实现一个栈,除了基本的栈操作(push和pop)之外,还要能提供一个getMin操作,能够在常数时间内获取栈中的最小元素。下面我们将详细探讨这个问题以及它...
以下是使用Java实现这个最小栈的代码示例: ```java public class MinStack { private Stack<Integer> mainStack; private Stack<Integer> minStack; public MinStack() { mainStack = new Stack(); minStack...
面试中可能会要求实现栈或队列的特定功能,如最小栈、双端队列等。 3. **树结构**:包括二叉树、平衡树(AVL、红黑树)、堆(最大堆、最小堆)等。面试中常见题目有构建树、遍历(前序、中序、后序)、查找、排序等...
可以使用两个栈,一个用于常规的push和pop操作,另一个用于存储最小元素,每次push时,如果新元素小于当前最小值,则将新元素也push到最小栈中,否则不做处理。这样,getMin操作始终可以在常数时间内完成。 3. **...
栈和队列是数据结构中的基础概念,它们在编程中有着广泛的应用,特别是在Java面试中常常被用来测试候选人的算法和...在面试中,候选人可能需要现场编写代码,实现这些功能,因此熟悉这些概念和实现方式是非常必要的。
Go 语言面试题系列主要涉及了 Go 语言的基础语法、并发特性以及错误处理等方面的知识。以下是对这些知识点的详细解析: 1. **赋值与定义变量的区别**: - `=` 是赋值操作符,用于将右侧的值赋给左侧的变量。如果...
- 查询最小元素时,返回最小栈的栈顶元素即可。 #### 2.4 求子数组的最大和 - **问题描述**:给定一个整型数组,求该数组的所有连续子数组中和最大的那个子数组的和。 - **解决方案**: - 使用动态规划的思想,设...
它可能会给出一些经典的面试问题,例如"两数之和","反转链表","最小栈"等,并提供解题思路和优化方法。 通过深入理解和熟练应用这些知识点,不仅可以帮助求职者在面试中表现出色,还能为他们在实际项目开发中打下...
这样,最小栈始终保持当前最小元素,而元素栈保持原始顺序,实现了min功能。 三、其他可能的面试题 题目列表中未提供完整的问题,但可以预见,其他题目可能包括: - 链表操作:如单链表反转、两链表相交点、环形...
"Stack_Queue"可能是包含Java代码的文件,可能包括了栈和队列的基本操作的示例代码,比如使用数组或链表实现,以及针对Google面试中可能出现的题目,如最小栈、环形队列等的解决方案。这些代码实例可以帮助学习者...
剑指offer面试题精选 剑指offer部分面试题使用javascript...面试题21:最小栈 面试题26:复杂链表的复制 面试题31:连续字数组的最大和 面试题32:从1到n的整数中1出现的次数 面试题34:丑数 面试题36:数组中的逆序对
7. **高级数据结构**:题目如“MergekSortedLists”、“InsertDeleteGetRandomO(1)”、“MinStack”和“AddTwoNumbers”需要应聘者熟悉高级数据结构的实现,例如最小栈和随机访问列表。 8. **面试准备策略**:在...
- Min Stack(最小栈) - Evaluate Reverse Polish Notation(逆波兰表达式求值) 10. Dynamic Programming(动态规划): 动态规划是一种在数学、管理科学、计算机科学、经济学和生物信息学等领域中使用的,用于...
密码一些leetcode主题,提高我的技能,扩大我的知识并为技术面试做准备做题记录序号题号译文1遍2遍3遍4遍5遍实现链接1个70 爬楼梯(爬梯子) 1.252 66 加一(加1) 1.26 2.13 1个二和(两数之和) 1.27 2.54 24 成对...
- **解答**:MVC(Model-View-Controller)是一种软件架构模式,它将应用程序分为三个核心部分:模型(Model)、视图(View)和控制器(Controller)。在Android中,MVC模式同样适用,其中: - **模型(Model)**:...
- 对于入栈顺序s1, s2, s3, s4, s5, s6,出栈顺序s2, s3, s4, s6, s5, s1,最小栈的大小至少需要2个空间,因为s2出栈后,s3, s4需要入栈,然后s4出栈,s5入栈,最后s6出栈,s5再出栈,s1才能出栈。 2. Linux中查看...
算法《剑指提供》,《程序员代码面试指南》,Leetcode等算法译集以及常用算法实现汇总本仓库是基于.net core的控制台程序,C#实现,包含每道译文的完整描述,多种解法AC代码,以及解题思路,所有转换直接运行以查看...