希望自己能够继续算法和数据结构知识的练习,这个是之前完成的一个题目,一并贴出来吧。
题目来源仍然和上篇博文一样:http://zhedahht.blog.163.com/blog/static/25411174200712895228171/
文中使用C语言实现,我采用Java实现。
题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。
实现思路:们需要一个辅助栈。每次push一个新元素的时候,同时将最小元素(或最小元素的位置。考虑到栈元素的类型可能是复杂的数据结构,用最小元素的位置将能减少空间消耗)push到辅助栈中;每次pop一个元素出栈的时候,同时pop辅助栈。
package stack;
import java.util.ArrayList;
/**
* 实现包含min函数的栈
* @author DHC
* @param <T>
*/
public class MinInStack<T> {
public static void main(String[] args) {
MinInStack<Integer> newStack = new MinInStack<Integer>();
newStack.push(4);
newStack.push(6);
newStack.push(2);
newStack.push(5);
newStack.pop();
newStack.pop();
newStack.push(1);
System.out.println(newStack.min());
}
public ArrayList<T> stack = new ArrayList<T>();
public ArrayList<Integer> minStack = new ArrayList<Integer>();
public T pop() {
int size = stack.size();
minStack.remove(size - 1);
return stack.remove(size - 1);
}
public void push(T item) {
int size = stack.size();
if (size == 0) {
minStack.add(0);
} else {
int minPosition = minStack.get(size - 1);
T minData = stack.get(minPosition);
if (compare(minData, item)) {
minStack.add(stack.size());
} else {
minStack.add(minPosition);
}
}
stack.add(item);
}
public T peek() {
int size = stack.size();
return stack.get(size - 1);
}
public T min() {
int size = minStack.size();
return stack.get(minStack.get(size - 1));
}
public boolean isEmpty() {
return stack.isEmpty();
}
/**
* 泛型元素的比较方法
* @param minData
* @param item
* @return true 代表当前元素小于之前的最小元素
*/
private boolean compare(T minData, T item) {
// 这儿不同的泛型类型可以用不同的方式实现
// 如果写成通用代码泛型之间应该肿么比较大小呢?是不是可以让泛型都继承某一接口呢?
int a = (Integer) minData;
int b = (Integer) item;
if(a > b) {
return true;
} else {
return false;
}
}
}
心得:
1、本来打算采用java中linkedList类直接生成数值栈,但是记录最小数值的另外一个栈存储的是数值栈的最小元素坐标,而Linkedlist作为栈时其坐标会变化,因此改用ArrayList实现栈。
2、可以用LinkedList直接生成具有栈行为的数据结构。
3、LinkedList采用的是链表的形式,addFirst和add方式分别插入的链表的头和尾部,与此对应,getFirst和get(list.size() - 1) 分别取得时链表头尾部的元素。
分享到:
相关推荐
在JAVA语言程序设计中,第十四章主要探讨的是多线程这一核心概念。多线程是Java编程中不可或缺的一部分,它允许程序同时执行多个独立的任务,从而提高应用程序的效率和响应性。在Java中,多线程是通过实现Runnable...
- 描述:仅使用栈实现队列的所有功能。 - 关键技术:使用两个栈,一个用于入队操作,另一个用于出队操作。 ### 二叉树 二叉树是非线性的数据结构,广泛应用于算法设计中。 - **BinaryTreePreorderTraversal** -...
4. **线程创建**:在Java中,可以通过`Thread`类的构造函数创建新线程,或者实现`Runnable`接口并将其传给`Thread`对象来创建线程。 5. **线程优先级**:Java定义了10个线程优先级,从`Thread.MIN_PRIORITY`(1)到...
本文档的主要目标是研究Java虚拟机(JVM)的工作原理及其设计背后的原因,而非深入探讨Java语言本身。我们将关注于机器如何运作,并且更重要的是,探究JVM开发者为何选择特定的方式来设计这些功能。 #### 为什么...
3. **线程状态**:Java线程有五种状态,包括新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和终止(Terminated)。理解这些状态有助于分析和优化线程的执行。 4. **线程同步**:为了防止多个...
Java的主要特点包括跨平台性(通过JVM实现)、面向对象、健壮性(垃圾回收机制)、安全性以及高性能。其优点包括强大的类库支持、丰富的开源框架、强大的网络编程能力以及广泛的企业支持。 Java中的继承和接口是两...
Java语言提供了丰富的线程支持,使得开发者可以方便地创建和控制线程。 线程与进程有所不同,进程是系统资源分配的基本单位,包含了虚拟内存映射、文件描述符、用户ID等信息,而线程则是执行流,属于轻量级的进程,...
数据库部分主要涉及SQL语言,包括连接查询(JOIN)、聚合函数(如COUNT、SUM、AVG、MAX、MIN)以及SQL注入的防范。了解SQL Select语句的执行顺序有助于优化查询性能。存储引擎如InnoDB和MyISAM决定了数据的存储方式...
4. 栈和队列:例如实现包含min函数的栈,栈的压入、弹出序列等。 5. 链表:包括链表中倒数第K个结点,链表中环的入口结点,反转链表,合并两个排序的链表等。 6. 查找算法:如数值的整数次方,数组中出现次数超过...
使用栈实现队列 946 合法的出栈序列 堆 相关代码 # Title 215 数组中第 k 大的数 264 295 ★★★ 寻找中位数 贪心算法 相关代码 # Title 045 跳跃游戏 055 跳跃游戏 376 摇摆序列 402 移除 k 个数字 452 射击气球 ...
Java 多线程编程是Java编程语言中的一个重要特性,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应速度。Java内置了对多线程的支持,使得开发者能够轻松地创建和管理线程。 线程是进程中的一条执行...
此压缩包"struts-2.3.31-min-lib"显然是Struts 2的一个轻量级版本,包含了该框架的核心库文件。版本号2.3.31表明这是在2017年发布的一个稳定版,它修复了之前版本中的一些已知问题,并可能引入了一些新功能或性能...
- 许多语言的标准库中都有红黑树的实现。 #### 九、堆 **概念**:堆是一种特殊的完全二叉树结构,分为最大堆和最小堆。 **特点**: - 最大堆中父节点的值总是大于或等于其子节点的值。 - 最小堆中父节点的值总是...
这部分主要考察应聘者的Java语言基本功,包括但不限于: 1. Java语法:类、对象、继承、封装、多态等面向对象概念。 2. 异常处理:异常分类、捕获和抛出机制。 3. 内存管理:理解栈与堆的区别,对象创建和垃圾回收...
- **Java内存区域**:包括堆、栈、程序计数器、本地方法栈和方法区。 - **内存模型**:规定了变量的存储位置以及线程对变量的操作规则。 #### 垃圾回收机制 - **GC算法**:包括标记-清除、复制、标记-整理等算法。...
1. Java基础知识:这部分主要考察对Java语言的基本概念、语法的理解,包括变量、数据类型、运算符、流程控制(如if、switch、for、while)、类、对象、封装、继承、多态等。同时,还涉及到异常处理和包的使用。 2. ...
Java面试宝典是Java开发者在求职过程中不可或缺的参考资料,它涵盖了广泛的Java技术点,帮助面试者准备各种面试挑战。以下是一些重要的Java面试知识点的详细解释...因此,全面了解并熟练掌握Java语言和技术栈至关重要。
#### 七、用两个栈实现队列 使用两个栈来模拟队列的操作。主要思路是将一个栈作为入队操作的栈,另一个栈作为出队操作的栈。当需要出队时,如果出队栈为空,则将入队栈的所有元素依次弹出并压入出队栈。 **示例:*...