题目描述

实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值。

你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成。

样例

如下操作:push(1),pop(),push(2),push(3),min(), push(1),min() 返回 1,2,1

先审题,返回值为1,2,1,分别是 pop(),min(),min() 这三个操作返回的值;在一般栈结构的基础上实现min方法来返回当前栈中的最小值,

我们可以增加一个辅助栈结构,用来记录当前栈的最小值。

手动推导一遍样例(方法1)

操作

当前栈:datastack

辅助栈:minstack

返回值

push(1)

1

1

pop()

1

push(2)

2

2

push(3)

2,3

2,2

min()

2,3

2,2

2

push(1)

2,3,1

2,2,1

min()

2,3,1

2,2,1

1

从上表的推导过程来看,当前栈的 push(),pop()操作与一般栈无区别,新添加的 min() 操作每次返回的是当前栈中的最小值元素,即辅助栈的栈顶元素;

而增加的辅助栈在 push() 操作上做了一点改变,每次压栈时,若当前元素 <= 辅助栈栈顶元素时,则将当前元素压入栈,否则,继续压入辅助栈栈顶元素;

实现代码:

 import java.util.Stack;

 public class MinStack {
public static void main(String[] args) {
MinStack stack = new MinStack();
stack.push(1);
stack.pop();
stack.push(2);
stack.push(3);
stack.min();
stack.push(1);
stack.min(); } Stack<Integer> datastack = new Stack<Integer>();
Stack<Integer> minstack = new Stack<Integer>(); /*当前栈压栈,1)最小值栈为空时,将该元素记录为最小值栈栈顶元素;2)最小值栈非空时,将该元素与最小值栈栈顶元素比较,谁小谁入栈;*/
public void push(int num) {
int top;
datastack.push(num);
if(!minstack.empty())
top = minstack.peek();
else
top = num; if(num > top)
minstack.push(top);
else
minstack.push(num); //System.out.println("push"+num+"时当前栈的栈顶元素为:"+datastack.peek());
//System.out.println("push"+num+"时最小值栈的栈顶元素为:"+minstack.peek()); }
/*返回当前栈栈顶元素,当前栈与最小值栈同时出栈;*/
public int pop() {
if(!datastack.isEmpty()) {
int data = datastack.peek();
datastack.pop();
minstack.pop();
//return data;
System.out.println("当前栈中的最小值为:"+ data);
}
return 0;
}
/*判断当前栈是否非空,返回当前栈中的最小值,即最小值栈的栈顶元素;*/
public int min() {
if(!datastack.isEmpty()) {
//return minstack.peek();
System.out.println("当前栈中的最小值为:"+minstack.peek());
}
return 0;
}
}

手动推导一遍样例(方法2)

操作

当前栈:datastack

辅助栈:minstack

返回值

push(1)

1

1

pop()

1

push(2)

2

2

push(3)

2,3

2

min()

2,3

2

2

push(1)

2,3,1

2,1

min()

2,3,1

2,1

1

方法2与方法1区别在于,第一点:方法2使用LinkedList数据结构来实现栈,而不是如方法1中直接使用Stack来实现栈;

第二点:方法2的辅助栈的 push() 操作只在栈为空或者当前元素 < 辅助栈栈顶元素时,才压栈;pop() 操作时,只有在栈顶元素与当前栈出栈元素相同时才出栈。

实现代码:

import java.util.LinkedList;

public class MinStack {
public static void main(String[] args) {
MinStack stack = new MinStack();
stack.push(1);
stack.pop();
stack.push(2);
stack.push(3);
stack.min();
stack.push(1);
stack.min(); }
LinkedList datastack = new LinkedList<Integer>();
LinkedList minstack = new LinkedList<Integer>(); /* 当前栈压栈,最小值栈为空时或者该元素比最小值栈栈顶元素小时压栈 */
public void push(int num) {
datastack.addFirst(num);
if(minstack.isEmpty()||num <= (int)minstack.getFirst()) {
minstack.addFirst(num);
}
} /* 判断当前栈非空,则出栈,若出栈元素与最小值栈栈顶元素相同,则也须出栈 */
public int pop() {
int data;
if(!datastack.isEmpty()) {
data = (int)datastack.removeFirst();
if(data == (int)minstack.getFirst()) {
minstack.removeFirst();
}
//return data;
System.out.println(data);
}
return 0;
} /* 返回最小值栈的栈定元素即所求的最小元素 */
public int min() {
if(!datastack.isEmpty()) {
return (int)minstack.getFirst();
//System.out.println((int)minstack.getFirst());
}
return 0;
}
}

总结:方法1与方法2在LintCode上均提交成功,运行时间分别为 2042ms 和 2088ms .

直接使用Stack类实现栈,理解简单易上手,重点掌握其 push()、pop()、peek()等方法;而使用LinkedLIst类来实现栈,这里只是为了加强LinkedList的练习,

重点掌握其 addFirst()、getFirst()、removeFirst() 等方法;同时还可以用ArrayList类来实现栈。

LintCode 12.带最小值操作的栈(两种方法实现)的更多相关文章

  1. lintcode12 带最小值操作的栈

    实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值. 你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成. 建一个栈helpStack,用来存放从 ...

  2. LintCode-12.带最小值操作的栈

    带最小值操作的栈 实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值. 你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成. 注意事项 如果堆栈中 ...

  3. Linux 下操作GPIO(两种方法,驱动和mmap)(转载)

    目前我所知道的在Linux下操作GPIO有两种方法: 1.编写驱动,这当然要熟悉Linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据io ...

  4. Linux 下操作gpio(两种方法,驱动和mmap)

    目前我所知道的在linux下操作GPIO有两种方法: 1.  编写驱动,这当然要熟悉linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据 ...

  5. 带最小值操作的栈 · Min Stack

    [抄题]: 实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值. 你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成. [思维问题]: [一句话思 ...

  6. [LintCode] 带最小值操作的栈

    class MinStack { public: MinStack() { // do initialization if necessary } void push(int number) { // ...

  7. Mysql使用binlog恢复数据解决误操作问题的两种方法

    为保证没有其他参数配置影响,重新安装配置了一台最小化安装的CentOS7虚拟机 1. 基础知识
 安装mysql5.6数据库Mysql binlog初步理解 2. 配置mysql 开启binlog.修 ...

  8. Android开发12——Andorid中操作数据库的insert的两种方法以及nullColumnHack

    一.发现问题 先看两种方法插入数据 public void save(Person p){ SQLiteDatabase db = dbHelper.getWritableDatabase(); db ...

  9. PHP生成带logo图像二维码的两种方法

    本文主要和大家分享PHP生成带logo图像二维码的两种方法,主要以文字和代码的形式和大家分享,希望能帮助到大家. 一.利用Google API生成二维码Google提供了较为完善的二维码生成接口,调用 ...

随机推荐

  1. Java程序员应该知道的linux命令

    1.查看Java进程:ps -ef|grep java,ps auxf|grep jva; 2.杀死所有Java进程: pkill java, kill -9 进程ID: 3.进入目录:cd /usr ...

  2. 数据分析核心包——pandas

    一.pandas简介 pandas是一个强大的Python数据分析的工具包,是基于NumPy构建的. 1.pandas的主要功能 (1)具备对其功能的数据结构DataFrame.Series (2)集 ...

  3. struts1.3.10 和 hibernate 3.3.2 一起加载时 出现javax.servlet.ServletException: java.lang.NoSuchMethodError: antlr.collections.A 错误

    struts1.3.10 需要导入一个 antlr-2.7.2.jar 的jar包: hibernate 3.3.2 需要导入一个 antlr-2.7.6.jar 的jar包,这两个包有冲突,所以需要 ...

  4. (阿里巴巴)数据库连接池——Druid (未完持续更新)

    Java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,有不得不使用数据库连接池.数据库连接池有很多选择,c3p.dhcp.proxool等,druid作为一名后起之秀,凭借其出色的性能,也 ...

  5. SharePoint Config database Log file too big – reduce it!

    SharePoint Config database logs are one thing to keep an eye on since they do have a tendency to gro ...

  6. TELNET_COMMAND

    TELENT COMMAND DEFINE:Telnet is a command control your cmd windows of remote computer. step: 1.Open ...

  7. 深入理解JVM读书笔记思维导图

    为了证明我已经啃完这本书然后买新书不用剁手...脑图画了8个钟,感觉整个人都不好了T_T 脑细胞不知道死了多少... 其实没吃透,估计若干年后要重新翻开来看...

  8. 别跑了,看看脚下有木有money

       别跑了,看看脚下有木有money 1.长大论坛   本来是想做个博客的,无奈级别不够,博客过于复杂,所以就做了这个类似于贴吧的东西.在这里,你可以发帖:可以吐槽学校.可以向他人寻求帮助.甚至可以 ...

  9. Git的认识与学习

    第一部分:我的git地址是https://github.com/monkeyDyang 第二部分:我对git的认识 Git是一种良好的.支持分支管理的代码管理方式,能很好地解决团队之间协作的问题.每个 ...

  10. ABAP和Java里关于DEFAULT(默认)机制的一些语言特性

    ABAP 740的新语法: 上图的代码相当于: DATA: ls_data LIKE LINE OF it_data. READ TABLE it_data INTO ls_data WITH KEY ...