`
knight_black_bob
  • 浏览: 853064 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

最小栈 三种实现(面试...)

    博客分类:
  • java
阅读更多

 

 

问题:实现一个栈,带有出栈(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/



 
 
 谢谢您的赞助,我会做的更好!

0
0
分享到:
评论

相关推荐

    前端大厂最新面试题-design (1).docx

    12. 最小栈:这是一个常见的数据结构问题,要求设计一种数据结构,可以实现最小栈的功能。 13. 设计推特:这是一个系统设计题,要求设计一个社交媒体平台,能够实现推文的发布、检索和管理等功能。 14. 电话目录...

    前端大厂最新面试题-stack.docx

    6. 最小栈(Min Stack):设计一个栈,能够在 O(1) 时间内获取最小值。难度:简单 7. 删除字符串中的所有相邻重复项(Remove All Adjacent Duplicates in String):给定一个字符串,删除所有相邻重复的字符。难度:...

    python-leetcode面试题解之第155题最小栈-题解.zip

    2. **最小栈设计**:为了实现getMin操作,我们需要考虑如何在每次push元素时更新最小值,同时在pop时保持最小值的正确性。常见的解决方案是在主栈外额外维护一个辅助栈,用来记录当前栈中的最小值。 3. **push操作*...

    java面试-leetcode面试题解之第155题最小栈-题解.zip

    第155题名为“最小栈”,是一道设计数据结构的问题,它要求我们实现一个栈,除了基本的栈操作(push和pop)之外,还要能提供一个getMin操作,能够在常数时间内获取栈中的最小元素。下面我们将详细探讨这个问题以及它...

    java-leetcode面试题解Stack之第155题最小栈-题解.zip

    以下是使用Java实现这个最小栈的代码示例: ```java public class MinStack { private Stack&lt;Integer&gt; mainStack; private Stack&lt;Integer&gt; minStack; public MinStack() { mainStack = new Stack(); minStack...

    微软等数据结构_算法面试100题第41-60题答案.rar

    面试中可能会要求实现栈或队列的特定功能,如最小栈、双端队列等。 3. **树结构**:包括二叉树、平衡树(AVL、红黑树)、堆(最大堆、最小堆)等。面试中常见题目有构建树、遍历(前序、中序、后序)、查找、排序等...

    数据结构+算法面试100题

    可以使用两个栈,一个用于常规的push和pop操作,另一个用于存储最小元素,每次push时,如果新元素小于当前最小值,则将新元素也push到最小栈中,否则不做处理。这样,getMin操作始终可以在常数时间内完成。 3. **...

    Java实现栈和队列面试题

    栈和队列是数据结构中的基础概念,它们在编程中有着广泛的应用,特别是在Java面试中常常被用来测试候选人的算法和...在面试中,候选人可能需要现场编写代码,实现这些功能,因此熟悉这些概念和实现方式是非常必要的。

    Go 面试题持续整理 Go 面试题持续整理

    Go 语言面试题系列主要涉及了 Go 语言的基础语法、并发特性以及错误处理等方面的知识。以下是对这些知识点的详细解析: 1. **赋值与定义变量的区别**: - `=` 是赋值操作符,用于将右侧的值赋给左侧的变量。如果...

    C语言面试题总结汇总经典.pdf

    - 查询最小元素时,返回最小栈的栈顶元素即可。 #### 2.4 求子数组的最大和 - **问题描述**:给定一个整型数组,求该数组的所有连续子数组中和最大的那个子数组的和。 - **解决方案**: - 使用动态规划的思想,设...

    c_faq.doc.zip_Help!

    它可能会给出一些经典的面试问题,例如"两数之和","反转链表","最小栈"等,并提供解题思路和优化方法。 通过深入理解和熟练应用这些知识点,不仅可以帮助求职者在面试中表现出色,还能为他们在实际项目开发中打下...

    数据结构算法设计笔试面试题100题内含C语言解析

    这样,最小栈始终保持当前最小元素,而元素栈保持原始顺序,实现了min功能。 三、其他可能的面试题 题目列表中未提供完整的问题,但可以预见,其他题目可能包括: - 链表操作:如单链表反转、两链表相交点、环形...

    栈与队列ppt及代码

    "Stack_Queue"可能是包含Java代码的文件,可能包括了栈和队列的基本操作的示例代码,比如使用数组或链表实现,以及针对Google面试中可能出现的题目,如最小栈、环形队列等的解决方案。这些代码实例可以帮助学习者...

    jianzhi-offer:剑指offer面试题-javascript版源码与测试用例

    剑指offer面试题精选 剑指offer部分面试题使用javascript...面试题21:最小栈 面试题26:复杂链表的复制 面试题31:连续字数组的最大和 面试题32:从1到n的整数中1出现的次数 面试题34:丑数 面试题36:数组中的逆序对

    Amazon亚麻 最新leetcode tag题

    7. **高级数据结构**:题目如“MergekSortedLists”、“InsertDeleteGetRandomO(1)”、“MinStack”和“AddTwoNumbers”需要应聘者熟悉高级数据结构的实现,例如最小栈和随机访问列表。 8. **面试准备策略**:在...

    CleanCodeHandbook_v1.0.3

    - Min Stack(最小栈) - Evaluate Reverse Polish Notation(逆波兰表达式求值) 10. Dynamic Programming(动态规划): 动态规划是一种在数学、管理科学、计算机科学、经济学和生物信息学等领域中使用的,用于...

    j-leetcode:一些leetcode主题,可以提高我的技能,扩展我的知识并为技术面试做准备

    密码一些leetcode主题,提高我的技能,扩大我的知识并为技术面试做准备做题记录序号题号译文1遍2遍3遍4遍5遍实现链接1个70 爬楼梯(爬梯子) 1.252 66 加一(加1) 1.26 2.13 1个二和(两数之和) 1.27 2.54 24 成对...

    全面的android面试题及答案

    - **解答**:MVC(Model-View-Controller)是一种软件架构模式,它将应用程序分为三个核心部分:模型(Model)、视图(View)和控制器(Controller)。在Android中,MVC模式同样适用,其中: - **模型(Model)**:...

    淘宝2017校园招聘清华笔试试题(1).pdf

    - 对于入栈顺序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代码,以及解主题算法,所有回归正确直接运行以查看输出结果。常用算法汇总中每个算法同样有测试用例,可运行

    算法《剑指提供》,《程序员代码面试指南》,Leetcode等算法译集以及常用算法实现汇总本仓库是基于.net core的控制台程序,C#实现,包含每道译文的完整描述,多种解法AC代码,以及解题思路,所有转换直接运行以查看...

Global site tag (gtag.js) - Google Analytics