`
燈小嗨
  • 浏览: 14642 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java语言实现包含min函数的栈

阅读更多

希望自己能够继续算法和数据结构知识的练习,这个是之前完成的一个题目,一并贴出来吧。


题目来源仍然和上篇博文一样:http://zhedahht.blog.163.com/blog/static/25411174200712895228171/


文中使用C语言实现,我采用Java实现。


题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数minpush以及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) 分别取得时链表头尾部的元素。

1
0
分享到:
评论

相关推荐

    JAVA语言程序设计-第十四章 多线程

    在JAVA语言程序设计中,第十四章主要探讨的是多线程这一核心概念。多线程是Java编程中不可或缺的一部分,它允许程序同时执行多个独立的任务,从而提高应用程序的效率和响应性。在Java中,多线程是通过实现Runnable...

    algorithm-essentials-java

    - 描述:仅使用栈实现队列的所有功能。 - 关键技术:使用两个栈,一个用于入队操作,另一个用于出队操作。 ### 二叉树 二叉树是非线性的数据结构,广泛应用于算法设计中。 - **BinaryTreePreorderTraversal** -...

    Java语言程序设计教程-雷学生-电子教案-204

    4. **线程创建**:在Java中,可以通过`Thread`类的构造函数创建新线程,或者实现`Runnable`接口并将其传给`Thread`对象来创建线程。 5. **线程优先级**:Java定义了10个线程优先级,从`Thread.MIN_PRIORITY`(1)到...

    Java JVM Instruction Set

    本文档的主要目标是研究Java虚拟机(JVM)的工作原理及其设计背后的原因,而非深入探讨Java语言本身。我们将关注于机器如何运作,并且更重要的是,探究JVM开发者为何选择特定的方式来设计这些功能。 #### 为什么...

    java 程序多线程设计课件

    3. **线程状态**:Java线程有五种状态,包括新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和终止(Terminated)。理解这些状态有助于分析和优化线程的执行。 4. **线程同步**:为了防止多个...

    大厂的Java面试题分享

    Java的主要特点包括跨平台性(通过JVM实现)、面向对象、健壮性(垃圾回收机制)、安全性以及高性能。其优点包括强大的类库支持、丰富的开源框架、强大的网络编程能力以及广泛的企业支持。 Java中的继承和接口是两...

    java中的线程

    Java语言提供了丰富的线程支持,使得开发者可以方便地创建和控制线程。 线程与进程有所不同,进程是系统资源分配的基本单位,包含了虚拟内存映射、文件描述符、用户ID等信息,而线程则是执行流,属于轻量级的进程,...

    Java学科面试宝典.pdf

    数据库部分主要涉及SQL语言,包括连接查询(JOIN)、聚合函数(如COUNT、SUM、AVG、MAX、MIN)以及SQL注入的防范。了解SQL Select语句的执行顺序有助于优化查询性能。存储引擎如InnoDB和MyISAM决定了数据的存储方式...

    剑指Offer---Java版代码

    4. 栈和队列:例如实现包含min函数的栈,栈的压入、弹出序列等。 5. 链表:包括链表中倒数第K个结点,链表中环的入口结点,反转链表,合并两个排序的链表等。 6. 查找算法:如数值的整数次方,数组中出现次数超过...

    leetcode跳跃-leetcode:LeetCode题记,Java语言

    使用栈实现队列 946 合法的出栈序列 堆 相关代码 # Title 215 数组中第 k 大的数 264 295 ★★★ 寻找中位数 贪心算法 相关代码 # Title 045 跳跃游戏 055 跳跃游戏 376 摇摆序列 402 移除 k 个数字 452 射击气球 ...

    Java 多线程编程教程

    Java 多线程编程是Java编程语言中的一个重要特性,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应速度。Java内置了对多线程的支持,使得开发者能够轻松地创建和管理线程。 线程是进程中的一条执行...

    struts-2.3.31-min-lib

    此压缩包"struts-2.3.31-min-lib"显然是Struts 2的一个轻量级版本,包含了该框架的核心库文件。版本号2.3.31表明这是在2017年发布的一个稳定版,它修复了之前版本中的一些已知问题,并可能引入了一些新功能或性能...

    Java数据结构和算法

    - 许多语言的标准库中都有红黑树的实现。 #### 九、堆 **概念**:堆是一种特殊的完全二叉树结构,分为最大堆和最小堆。 **特点**: - 最大堆中父节点的值总是大于或等于其子节点的值。 - 最小堆中父节点的值总是...

    Java面试宝典V9.0.pdf

    这部分主要考察应聘者的Java语言基本功,包括但不限于: 1. Java语法:类、对象、继承、封装、多态等面向对象概念。 2. 异常处理:异常分类、捕获和抛出机制。 3. 内存管理:理解栈与堆的区别,对象创建和垃圾回收...

    java面试题及答案-非常全面(包括基础、网络、数据结构、算法及IT大厂面经)

    - **Java内存区域**:包括堆、栈、程序计数器、本地方法栈和方法区。 - **内存模型**:规定了变量的存储位置以及线程对变量的操作规则。 #### 垃圾回收机制 - **GC算法**:包括标记-清除、复制、标记-整理等算法。...

    Java学科面试宝典V7.2.docx

    1. Java基础知识:这部分主要考察对Java语言的基本概念、语法的理解,包括变量、数据类型、运算符、流程控制(如if、switch、for、while)、类、对象、封装、继承、多态等。同时,还涉及到异常处理和包的使用。 2. ...

    Java面试宝典

    Java面试宝典是Java开发者在求职过程中不可或缺的参考资料,它涵盖了广泛的Java技术点,帮助面试者准备各种面试挑战。以下是一些重要的Java面试知识点的详细解释...因此,全面了解并熟练掌握Java语言和技术栈至关重要。

    java算法题指导手册

    #### 七、用两个栈实现队列 使用两个栈来模拟队列的操作。主要思路是将一个栈作为入队操作的栈,另一个栈作为出队操作的栈。当需要出队时,如果出队栈为空,则将入队栈的所有元素依次弹出并压入出队栈。 **示例:*...

Global site tag (gtag.js) - Google Analytics