数据结构和算法之栈和队列三:自定义一个栈包含min函数
我们都知道一个栈的特点是后进先出,如果我们要实现在O(1)的时间内找到一个栈里面的最小值,我们应该怎么解决?如果我们采用遍历获取的思路那必然所需要的时间是O(N)与我们所需要的要求明显不符合,这时候我们通常需要采用的是和前面我们介绍到的栈的压入弹出序列相类似,采用辅助栈的思想。我们不妨构建一个辅助栈,当我们在栈压入数据时,就和辅助栈里面的最小值比较,如果大就存入栈里面的最小值,如果小我们就存入这个数据。我们的辅助栈是每存入一个数据的时候就存入一个当前数据结构的最小值,为了避免我们遇到一个问题,就是在最小值弹出以后我们找不到最小值的尴尬,所以辅助栈的栈顶元素应该随着压栈和弹栈的操作同时进行。有了思路我们的代码如下:
public class MyStack(){
//自定义一个栈
private int size;
private int min = Integer.MAX_VALUE;
private Integer[] elements = new Integer[10];
private Stack minStack<Integer> = new Stack<>();
//当一个数据插入栈
public void push(int num){
//对数组进行扩容处理
ensureCapaCity(size)
elements[size++] = num;
//对辅助栈的数据进行操作
if(num > min){
minStack.push(min);
}else{
minStack.push(num);
min = minStack.peek();
}
}
//数组的扩容方法
public void ensureCapaCity(int length){
if(length >= elements.length){
length = (length * 3) / 2 + 1;
elements = Arrays.copyOf(elements,length);
}
}
//进行弹出操作
public int pop(){
if(size != 0){
elements[size - 1] = null;
size -= 1;
int p = minStack.pop();
min = minStack.peek();
return p;
}
throw New Expection("栈长度为0");
}
//min函数的最小值
public int min(){
return min;
}
}
我们在这里主要需要我们去理解的是借助于辅助栈,对每插入一个数据进行一轮最小值的储存,当栈里面的元素被弹出时我们辅助栈里面的栈顶元素也会随之而改变。
数据结构和算法之栈和队列三:自定义一个栈包含min函数的更多相关文章
- [剑指offer] 5. 用两个栈实现队列+[剑指offer]30. 包含min函数的栈(等同于leetcode155) +[剑指offer]31.栈的压入、弹出序列 (队列 栈)
c++里面stack,queue的pop都是没有返回值的, vector的pop_back()也没有返回值. 思路: 队列是先进先出 , 在stack2里逆序放置stack1的元素,然后stack2. ...
- 《剑指offer》第三十题(包含min函数的栈)
// 面试题30:包含min函数的栈 // 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min // 函数.在该栈中,调用min.push及pop的时间复杂度都是O(1). #i ...
- 面试题之堆栈队列系列一:设计包含min函数的栈
编译环境 本系列文章所提供的算法均在以下环境下编译通过. [算法编译环境]Federa 8,linux 2.6.35.6-45.fc14.i686 [处理器] Intel(R) Core(TM)2 Q ...
- 包含min函数的栈、队列
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈/队列的最小元素的min函数.在该栈/队列中,调用min.入栈(入队列)及出栈(出队列)函数的时间复杂度都是O(1). 1. 包含min函数的栈 ...
- SDUT-2133_数据结构实验之栈与队列三:后缀式求值
数据结构实验之栈与队列三:后缀式求值 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于一个基于二元运算符的后缀表示式 ...
- 数据结构与算法(3)----->队列和栈
1. 栈和队列的基本性质 栈是先进后出;(像是子弹夹,后进先打出) 队列是先进先出;(像是平时排队买冰淇淋,按顺序轮流) 栈和队列在实现的结构上可以有数组和链表两种形式; (1)数组结构实现容易; ( ...
- SDUT-3334_数据结构实验之栈与队列七:出栈序列判定
数据结构实验之栈与队列七:出栈序列判定 Time Limit: 30 ms Memory Limit: 1000 KiB Problem Description 给一个初始的入栈序列,其次序即为元素的 ...
- 【老鸟学算法】包含 min函数的栈设计——java实现
要求: 1. 定义栈的数据结构,要求添加一个 min函数,能够得到栈的最小元素. 2. 要求函数 min.push 以及 pop 的时间复杂度都是 O(1). 这是考验“栈”数据结构设计.众所周知,栈 ...
- 算法: 包含min函数的栈
* @Description 包含min函数的栈* @问题:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)).* @思路: 1:Stack 类中的p ...
随机推荐
- python 字典获取最大和最小的value
my_dict = {, , } key_max = max(my_dict.keys(), key=(lambda k: my_dict[k])) key_min = min(my_dict.key ...
- Nginx 多进程连接请求/事件分发流程分析
Nginx使用多进程的方法进行任务处理,每个worker进程只有一个线程,单线程循环处理全部监听的事件.本文重点分析一下多进程间的负载均衡问题以及Nginx多进程事件处理流程,方便大家自己写程序的时候 ...
- Mysql语句转义
String sqlStr = "SELECT * FROM t_sys_dic WHERE idPath LIKE" + "'" + "/19/20 ...
- 原生javascript-图片滚动按需加载
图片滚动按需加载:在某个区域的图片(自定义的范围,一般是首屏以下的区域),拉动滚动,图片出现在可视范围才开始加载,目的是减少请求,减耗宽带,提高首屏的呈现速度,让用户第一时间看到网页内容,留下美好的第 ...
- java 替换字符串中的中括号
正确方式:"[adbdesf]".replaceAll("\\[", "").replaceAll("\\]", &qu ...
- 垃圾收集器G1推荐配置
-XX:OnOutOfMemoryError=kill -9 %p -XX:OnError=jstack -F %p >ErrorDump.log -Xms4g -Xmx8g -server - ...
- css之grid layout代码解释
.wrapper { display: grid; grid-template-columns: repeat(3, 1fr);/*grid-template-columns CSS属性定义了网格列的 ...
- [转载]java正则表达式
转载自:http://butter.iteye.com/blog/1189600 1.正则表达式的知识要点1.正则表达式是什么?正则表达式是一种可以用于模式匹配和替换的强有力的工具.2.正则表达式的优 ...
- jinja 2 filter 使用
文档地址 http://jinja.pocoo.org/docs/templates/#builtin-filters indent indent(s, width=4, indentfirst=Fa ...
- TF随笔-13
import tensorflow as tf a=tf.constant(5) b=tf.constant(3) res1=tf.divide(a,b) res2=tf.div(a,b) with ...