`
kevin_in_java
  • 浏览: 30307 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论
阅读更多

定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
要求函数min、push以及pop的时间复杂度都是O(1)。

 

感谢csdn July整理题目和答案http://blog.csdn.net/v_JULY_v/article/details/6057286

 

这里我写的第二题的java 代码实现。

实现原理

入栈时,比较辅助栈栈顶元素大小,如果新增元素小于等于辅助栈栈顶元素,辅助栈同时入栈。出栈时,如果出栈元素等于辅助栈栈顶元素(即出栈元素为最小值),辅助栈同时出栈

例如压栈 5,2,2,1,6,3

栈     辅助栈

5         5

2         2

2         2

1         1

6       

3

 

出栈时

3          1

6          1

1          2

2          2

2          5

5         null

 

一、定义节点类,添加了遍历和添加方法,在本题目中使用不到

package cn.edu.cqupt.mircrosoft100;

public class Node {
	private Integer value;
	private Node next;
	public Node(int value)
	{
		this.value=value;
	}
	public Node()
	{
		
	}
	public void add(int value)
	{
		if(null==this.value)
		{
			this.value=value;
			return;
		}
		if(null==next)
			next=new Node();
		next.add(value);
	}
	public void list()
	{
		if(null!=value)
		System.out.println(value);
		if(null==next)
			return;
		next.list();
	}
	public Integer getValue() {
		return value;
	}
	public void setValue(Integer value) {
		this.value = value;
	}
	public Node getNext() {
		return next;
	}
	public void setNext(Node next) {
		this.next = next;
	}
	
}
	

 

二、辅助栈的实现

package cn.edu.cqupt.mircrosoft100;

public class AssistStack {
	private Node top;
	public void push(int value)
	{
		Node add= new Node(value);
		if(null==top)
		{
			top=add;
			return;
		}
		add.setNext(top);
		top=add;
	}
	public Integer pop()
	{
		if(null==top)
			return null;
		Integer temp = top.getValue();
		top=top.getNext();
		return temp;
	}
	public Node getTop() {
		return top;
	}
	public void setTop(Node top) {
		this.top = top;
	}
}

 

三、实现最小栈

package cn.edu.cqupt.mircrosoft100;

public class MinStack {
	private AssistStack assistStack=new AssistStack();//辅助栈,实现O(1)min函数
	private Node top;
	public void push(int value)
	{
		Node add = new Node(value);
		if(null==top)
		{
			top=add;
			assistStack.push(value);
			return;
		}
		add.setNext(top);
		top=add;
		refresh();
	}
	public void refresh()
	{
		int temp = top.getValue();
		if(temp<=assistStack.getTop().getValue())
			assistStack.push(temp);
	}
	public Integer pop()
	{
		Integer temp = top.getValue();
		if(null==temp)
			return null;
		if(temp==assistStack.getTop().getValue())
			assistStack.pop();
		top=top.getNext();
		return temp;
	}
	public Integer getMin()
	{
		if(null==assistStack.getTop())
			return null;
		return assistStack.getTop().getValue();
	}
	public static void main(String args[])
	{
		MinStack minStack =new MinStack();
		minStack.push(5);
		minStack.push(2);
		minStack.push(3);
		minStack.push(3);
		minStack.push(6);
		System.out.println("min:"+minStack.getMin());
		System.out.println("pop:"+minStack.pop()); 
		System.out.println("min:"+minStack.getMin());
		System.out.println("pop:"+minStack.pop()); 
		System.out.println("min:"+minStack.getMin());
		System.out.println("pop:"+minStack.pop()); 
		System.out.println("min:"+minStack.getMin());
		System.out.println("pop:"+minStack.pop()); 
		System.out.println("min:"+minStack.getMin());
		System.out.println("pop:"+minStack.pop()); 
		System.out.println("min:"+minStack.getMin());
	}
}

 

0
0
分享到:
评论

相关推荐

    剑指offer算法实现java版——面试题21包含min函数的栈

    实现一个栈,要求使用O(1)时间获取栈中最小值,O(1)执行pop、push操作。

    Java实现栈和队列面试题

    以上就是Java实现栈和队列面试题的主要内容。理解和熟练掌握这些知识点对于Java开发者来说至关重要,因为它们涉及到基础数据结构的运用,能够反映候选人在解决实际问题时的逻辑思维和算法能力。在面试中,候选人可能...

    C语言实现栈的操作

    在C语言中,我们可以通过动态内存分配和指针操作来实现栈的各种操作。以下将详细讲解如何用C语言实现这些基本操作: 1. 初始化栈:首先,我们需要定义一个栈的数据结构,通常包括一个指向栈顶元素的指针和一个表示...

    获得栈中的最小元素

    下面是一个使用Java实现的`GetMinStack`类: ```java public class GetMinStack { private Stack&lt;Integer&gt; mainStack; private Stack&lt;Integer&gt; minStack; public GetMinStack() { mainStack = new Stack(); ...

    Java开发技术大全(500个源代码).

    constructWithPara.java 带参数的构造方法 declareDefault.java 缺省访问权限的使用 declarePrivate.java 私有访问权限的使用 declareProtected.java 保护访问权限的使用 deriveClass.java 子类访问父类变量...

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

    在Java中,我们可以使用ArrayList或LinkedList来实现栈。 对于第155题,我们不能简单地在每次push和pop时更新最小值,因为这将导致getMin的时间复杂度不再是O(1)。为了解决这个问题,我们可以维护两个栈:一个主栈...

    Java实现截图功能

    本篇文章将详细探讨如何利用Java技术栈实现这一功能,主要聚焦于`Jcrop`库在Spring MVC框架中的应用。 首先,`Jcrop`是一个JavaScript库,用于处理图像的选择区域,它提供了一种直观的方式来让用户在图片上选择一个...

    剑指offer 计划1(栈与队列)---java(csdn)————程序.pdf

    在给出的`MinStack`类中,`push()`方法负责元素的入栈和最小值更新,`pop()`方法处理元素出栈,`top()`方法返回栈顶元素,`min()`方法则返回当前栈中的最小值。 【总结】 这两个问题展示了如何巧妙地使用数据结构...

    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...

    ShaunSheep#cs-wiki#30. 包含 min 函数的栈1

    30. 包含 min 函数的栈题目链接牛客网题目描述实现一个包含 min() 函数的栈,该方法返回当前栈中最小的值。在对栈进行 push 入栈和 pop 出栈操

    java代码实现文本编辑器

    Java作为一种广泛使用的编程语言,具有丰富的库和框架,使得用Java实现Web文本编辑器成为可能。在这个项目中,我们将探讨如何利用Java技术栈来创建一个网页内的文本编辑器,并通过引入JavaScript来增强用户体验。 ...

    wyh317#JZoffer#面试题30:包含min函数的栈1

    面试题30:包含min函数的栈题目定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。方法准备一个辅助栈,每次都把最小的元素(之前的最小元素

    java 拿火柴游戏

    * 通过这些组件来掌握事件监听器的用法、Java 中栈的用法、Runnable 类的 TimerTask 类的用法 * 通过 Graphics 类中的主要方法的使用,学会运用这些方法来绘制火柴、绘制图片的目的 四、 源程序 源程序中使用了...

    Java Thread Programming

    在Java中,线程可以被视为程序的执行流,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈和一部分堆内存。本资料“Java Thread Programming”由Paul Hyde提供,包含了关于Java线程编程的理论知识和实践代码,...

    LuoJhno#knowledge#包含min的最小栈1

    包含min的最小栈题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的 min 函数。public void push(int num) {pub

    algorithm-essentials-java

    本文件将围绕Java编程语言中的关键算法展开讨论,并通过具体的示例来帮助读者理解和掌握这些算法的实现方法。 ### 线性表 线性表是最基本的数据结构之一,可以被视为一种元素序列,每个元素都具有一个唯一的前驱和...

    java的集合类教学

    Java的集合类是Java编程中不可或缺的一部分,它们用于存储、管理和操作对象。集合框架是一个类库的集合,提供了表示和操作集合的统一...理解并熟练掌握这些接口和实现类的特性和使用方法,是提高Java编程效率的关键。

    java thread

    在Java中,一个进程可以有多个线程,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈,而共享堆内存和方法区。通过创建线程,你可以使程序并行处理不同的任务,比如在用户界面更新的同时执行后台计算。 `Sleep...

    java 多线程.ppt,多线程

    Java线程有10个优先级,从MIN_PRIORITY(1)到MAX_PRIORITY(10),默认优先级是NORM_PRIORITY(5)。优先级高的线程会被优先调度,但这并不保证绝对的执行顺序,因为线程调度很大程度上依赖于操作系统的调度策略。...

Global site tag (gtag.js) - Google Analytics