`

Java实现自定义栈

 
阅读更多
package test.Stack;

/**       
 * @projectName:
 * @packageName: test.Stack
 * @ClassName  : ArrayStack
 * @createBy   :Test
 * @createDate :2014-6-11 上午09:33:25   
 * @useFor     : 自定义栈
 *    
 */

import java.util.Arrays;

public class ArrayStack<T> implements IStack<T> {
	private final int DEFAULT_SIZE = 3;
	private int size = 0;
	private int capacity = 0;
	
	//top指向下一个能够添加元素的位置
	private int top = 0;
	private Object[] array;
	
	public ArrayStack(){
		this.capacity = this.DEFAULT_SIZE;
		this.array = new Object[this.capacity];
		this.size = 0;
	}
	
	public ArrayStack(int capacity){
		this.capacity = capacity;
		this.array = new Object[this.capacity];
		this.size = 0;
	}
	
	@Override
	public boolean isEmpty() {
		return size == 0;
	}

	@SuppressWarnings("all")
	@Override
	public T peek() {
		return (T)this.array[this.top-1];
	}

	@SuppressWarnings("all")
	@Override
	public T pop() {
		T element = (T)this.array[top - 1];
		this.array[top--] = null;
		this.size--;
		return element;
	}

	@Override
	public void push(T element) {
		if(this.size < this.capacity){
			this.array[top] = element;
			this.top++;
			this.size ++;
		}else{
			enlarge();
			push(element);
		}
	}
	/**
	 * 
	 *@User   :Test
	 *@date   :2014-6-11 上午09:37:48
	 *@return :void
	 *@userFor : 扩容
	 */
	public void enlarge(){
		this.capacity = this.capacity + this.DEFAULT_SIZE;
		Object[] newArray = new Object[this.capacity];
		System.arraycopy(array, 0, newArray, 0, array.length);
		//把旧的array用null填充
		Arrays.fill(array, null);
		this.array = newArray;
	}
	
	public int size(){
		return this.size;
	}

	@Override
	public void clear() {
		Arrays.fill(array, null);
		this.top = 0;
		this.size = 0;
		this.capacity = this.DEFAULT_SIZE;
		this.array = new Object[this.capacity];
	}
	
	
	public static void main(String[] args) {
		ArrayStack<Integer> stack = new ArrayStack<Integer>();  
        stack.push(1);  
        stack.push(2);  
        stack.push(3);  
        stack.push(4);  
        stack.push(5);  
        System.out.println(stack.isEmpty());  
        System.out.println(stack.pop());  
        System.out.println(stack.pop());  
        System.out.println(stack.pop());  
        System.out.println(stack.pop());  
        System.out.println(stack.size());  
        stack.clear();
        System.out.println(stack.size());  
	}
}


分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    java实现的栈

    然而,如果你需要自定义栈的行为或者优化性能,你可以选择实现`java.util.Deque`接口或者直接继承`java.util.ArrayList`或`java.util.LinkedList`来创建自己的栈。例如,下面是一个基于`ArrayList`的栈实现: ```...

    java双端队列的实现-Java实现自定义双端队列(链表和数组两种方式) 数组和链表.pdf

    Java 双端队列的实现 Java 中的双端队列(Deque)是一种特殊的队列,能够在队列的两端进行元素的添加和删除...Java 实现自定义双端队列可以通过链表和数组两种方式实现,双端队列可以充当单端队列,也可以用于充当栈。

    JAVA动态表单设计,自定义表单,自定义数据

    总的来说,"JAVA动态表单设计,自定义表单,自定义数据"涉及的技术栈包括Java后端开发、前端界面设计、数据库管理和RESTful API设计。通过以上各模块的协同工作,可以构建出一个高效、易用的动态表单系统,满足不同...

    自定义的RPC的Java实现

    理解TCP/IP协议栈和Java的Socket API是实现RPC的基础。 其次,请求和响应的数据交换需要用到序列化。Java中常见的序列化库有Java自带的序列化机制、protobuf、Hessian等。选择合适的序列化库能够提高数据传输效率,...

    线性表,单链表,栈 java实现

    下面将详细解释这些概念及其Java实现。 **线性表** 是一种基本的数据结构,它是由n(n&gt;=0)个相同类型元素构成的有限序列。线性表中的元素具有顺序关系,即每个元素都有一个前驱和后继,除了第一个元素没有前驱,...

    Netty中Marshalling编解码自定义栈应用

    本文将深入探讨 Marshalling 编解码器在 Netty 中的应用及其自定义实现。 Marshalling 是一种序列化技术,它能够将 Java 对象转换为字节流,便于在网络中传输,同时也可以将字节流恢复为原来的对象。在 Netty 中,...

    Java 实例 - 栈的实现源代码-详细教程.zip

    学习如何使用和自定义栈可以帮助开发者更好地处理数据和优化算法性能。 总之,这个"Java实例 - 栈的实现源代码-详细教程"将引导你逐步了解和掌握如何在Java中实现和使用栈。通过实践这些源代码,你可以巩固理论知识...

    java作业 类设计 实现栈的基本结构 小型计算器

    - **数据类型**:决定栈是否只接受特定类型(如整数、字符或自定义对象)或支持多种类型(使用Object作为元素类型)。 - **容量管理**:考虑栈的初始容量和动态扩容机制,以避免溢出或浪费空间。 3. **小型计算器...

    栈的java版演示栈的java版演示栈的java版演示

    4. **自定义栈实现** 虽然`java.util.Stack`提供了栈的功能,但有时我们可能需要更灵活的实现,比如使用数组或链表。这里我们可以使用`ArrayList`或`LinkedList`来自定义栈: - **使用ArrayList实现**: ```java ...

    Java自定义异常类_1.txt

    ### 实现自定义异常的步骤: #### 步骤一:定义自定义异常类 1. **继承`Exception`或其子类**:如果自定义异常应该被捕获,则继承`Exception`或其子类;如果该异常代表程序内部错误,考虑继承`Error`。 2. **...

    Java如何自定义异常打印非堆栈信息详解

    要自定义异常打印非堆栈信息,需要重写Throwable类的printStackTrace()方法,并在该方法中实现自定义的打印逻辑。例如,可以使用Logger来将异常信息记录到日志文件中,从而实现非堆栈信息的打印。 四、示例代码 ...

    Java版数据结构代码,栈,动态数组,队列,链表,二叉树

    本资源提供了Java实现的数据结构代码,包括栈、动态数组、队列、链表和二叉树,这些都是计算机科学中最基础且重要的数据结构。 1. **栈(Stack)**:栈是一种“后进先出”(LIFO)的数据结构,常用于表达式求值、...

    Java实现画板(Java小程序 模仿Win系统画板)

    在本文中,我们将深入探讨如何使用...总结起来,Java实现的画板程序涉及到GUI设计、图形绘制、事件处理、文件操作等多个核心Java技术。通过学习和实践这个项目,开发者可以加深对Java Swing的理解,提升GUI编程能力。

    自定义struts(实现拦截器)

    - 为了确保自定义的Struts配置和实现正确工作,你需要进行单元测试和集成测试。可以使用JUnit或其他测试框架来测试Action和拦截器,同时在浏览器中进行实际的请求测试,确保请求能够正确路由到Action,拦截器按预期...

    java简易计算器(四则运算、三角函数、实现优先级)

    - `Stack.java`: 自定义栈类,可能包含了一些额外的功能,如检查优先级等。 - 可能还有其他的辅助类或测试类。 总的来说,这个Java简易计算器项目涵盖了基础的数学运算、三角函数、数据结构(栈)、算法(逆波兰...

    cmpp2.0 java实现

    总结,Java实现CMPP2.0协议涉及到网络编程、协议解析、多线程等多个技术领域,需要对TCP/IP通信、Java NIO、字符串编码有一定了解,并且能够根据具体需求进行业务逻辑的设计和实现。通过阅读和理解提供的Java源码,...

    java实现js中eval功能

    以上是使用Java实现JavaScript`eval`功能的基本思路和方法。需要注意的是,这种模拟`eval`的行为可能会带来安全风险,因为用户提供的输入可能包含恶意代码。因此,在实际应用中,务必对输入进行严格的验证和限制,...

    消息总线java实现

    在Java中,我们可以利用如Apache ActiveMQ、RabbitMQ或Kafka等成熟的消息中间件,但此处我们讨论的是自定义实现。 为了构建一个简单的Java消息总线,我们需要以下几个关键组件: 1. **消息接口**:定义消息的通用...

    java实现网络抓包

    总的来说,Java实现网络抓包是一项涉及多方面技术的工作,需要深入理解网络协议、数据包解析和HTTP交互。通过实践和学习,开发者可以构建强大的网络监控工具,帮助排查网络问题,优化应用性能,甚至进行安全分析。

    java实现数据结构

    Java的`PriorityQueue`类实现了这个概念,元素按照其自然顺序或自定义比较器进行排序。`offer()`方法添加元素,`poll()`移除并返回最高优先级元素,`peek()`查看但不移除。 最后,哈希表,也称为散列表,提供快速的...

Global site tag (gtag.js) - Google Analytics