定义栈的数据结构,要求添加一个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());
}
}
分享到:
相关推荐
实现一个栈,要求使用O(1)时间获取栈中最小值,O(1)执行pop、push操作。
以上就是Java实现栈和队列面试题的主要内容。理解和熟练掌握这些知识点对于Java开发者来说至关重要,因为它们涉及到基础数据结构的运用,能够反映候选人在解决实际问题时的逻辑思维和算法能力。在面试中,候选人可能...
在C语言中,我们可以通过动态内存分配和指针操作来实现栈的各种操作。以下将详细讲解如何用C语言实现这些基本操作: 1. 初始化栈:首先,我们需要定义一个栈的数据结构,通常包括一个指向栈顶元素的指针和一个表示...
下面是一个使用Java实现的`GetMinStack`类: ```java public class GetMinStack { private Stack<Integer> mainStack; private Stack<Integer> minStack; public GetMinStack() { mainStack = new Stack(); ...
constructWithPara.java 带参数的构造方法 declareDefault.java 缺省访问权限的使用 declarePrivate.java 私有访问权限的使用 declareProtected.java 保护访问权限的使用 deriveClass.java 子类访问父类变量...
在Java中,我们可以使用ArrayList或LinkedList来实现栈。 对于第155题,我们不能简单地在每次push和pop时更新最小值,因为这将导致getMin的时间复杂度不再是O(1)。为了解决这个问题,我们可以维护两个栈:一个主栈...
本篇文章将详细探讨如何利用Java技术栈实现这一功能,主要聚焦于`Jcrop`库在Spring MVC框架中的应用。 首先,`Jcrop`是一个JavaScript库,用于处理图像的选择区域,它提供了一种直观的方式来让用户在图片上选择一个...
在给出的`MinStack`类中,`push()`方法负责元素的入栈和最小值更新,`pop()`方法处理元素出栈,`top()`方法返回栈顶元素,`min()`方法则返回当前栈中的最小值。 【总结】 这两个问题展示了如何巧妙地使用数据结构...
以下是使用Java实现这个最小栈的代码示例: ```java public class MinStack { private Stack<Integer> mainStack; private Stack<Integer> minStack; public MinStack() { mainStack = new Stack(); minStack...
30. 包含 min 函数的栈题目链接牛客网题目描述实现一个包含 min() 函数的栈,该方法返回当前栈中最小的值。在对栈进行 push 入栈和 pop 出栈操
Java作为一种广泛使用的编程语言,具有丰富的库和框架,使得用Java实现Web文本编辑器成为可能。在这个项目中,我们将探讨如何利用Java技术栈来创建一个网页内的文本编辑器,并通过引入JavaScript来增强用户体验。 ...
面试题30:包含min函数的栈题目定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。方法准备一个辅助栈,每次都把最小的元素(之前的最小元素
* 通过这些组件来掌握事件监听器的用法、Java 中栈的用法、Runnable 类的 TimerTask 类的用法 * 通过 Graphics 类中的主要方法的使用,学会运用这些方法来绘制火柴、绘制图片的目的 四、 源程序 源程序中使用了...
在Java中,线程可以被视为程序的执行流,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈和一部分堆内存。本资料“Java Thread Programming”由Paul Hyde提供,包含了关于Java线程编程的理论知识和实践代码,...
包含min的最小栈题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的 min 函数。public void push(int num) {pub
本文件将围绕Java编程语言中的关键算法展开讨论,并通过具体的示例来帮助读者理解和掌握这些算法的实现方法。 ### 线性表 线性表是最基本的数据结构之一,可以被视为一种元素序列,每个元素都具有一个唯一的前驱和...
Java的集合类是Java编程中不可或缺的一部分,它们用于存储、管理和操作对象。集合框架是一个类库的集合,提供了表示和操作集合的统一...理解并熟练掌握这些接口和实现类的特性和使用方法,是提高Java编程效率的关键。
在Java中,一个进程可以有多个线程,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈,而共享堆内存和方法区。通过创建线程,你可以使程序并行处理不同的任务,比如在用户界面更新的同时执行后台计算。 `Sleep...
Java线程有10个优先级,从MIN_PRIORITY(1)到MAX_PRIORITY(10),默认优先级是NORM_PRIORITY(5)。优先级高的线程会被优先调度,但这并不保证绝对的执行顺序,因为线程调度很大程度上依赖于操作系统的调度策略。...