栈是限制在表的一端,进行插入和删除操作的线性表,栈是后进先出
栈的操作:
构造栈
销毁栈
清空栈
计算栈长度
取栈顶元素
元素压栈
元素弹栈
代码:
package com.alg.stack;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.NoSuchElementException;
// 栈是限制在表的一端,进行插入和删除操作的线性表,栈是后进先出
//栈的操作:构造栈 销毁栈 清空栈 计算栈长度 取栈顶元素 元素压栈 元素弹栈
// Iterable实现这个可以使用for(T t:stack)循环
public class Stack<T> implements Iterable<T>
{
// 统计数组内保存的元素数量
private int elementCount;
// 保存数据的数组
protected Object[] elementData = null;
// 数组的每次增长幅度
protected int capacityIncrement;
// 默认数组大小
private static final int DEFAULT_SIZE = 10;
// 操作数
private int modCount;
public Stack()
{
this(DEFAULT_SIZE, 0);
}
public Stack(int capacity)
{
this(capacity, 0);
}
public Stack(int capacity, int capacityIncrment)
{
elementData = newElementArray(capacity);
elementCount = 0;
this.capacityIncrement = capacityIncrment;
}
// 取栈顶元素
@SuppressWarnings("unchecked")
public T peek()
{
return (T) elementData[elementCount - 1];
}
// 出栈
@SuppressWarnings("unchecked")
public T pop()
{
final int index = --elementCount;
T t = (T) elementData[index];
elementData[index] = null;
modCount++;
return t;
}
// 入栈
public void push(T object)
{
// 栈满,增加栈容量
if (elementCount == elementData.length)
{
growByOne();
}
elementData[elementCount++] = object;
modCount++;
}
// 清空栈
public void clear()
{
for (int i = 0; i < elementCount; i++)
{
elementData = null;
}
modCount++;
elementCount = 0;
}
@SuppressWarnings( {"unused", "unchecked"})
private T[] newElementArray(int size)
{
return (T[]) new Object[size];
}
// 如果从节省空间角度考虑capacityIncrement最好设置
private void growByOne()
{
int adding = 0;
// 没有设置增量的情况
if (capacityIncrement <= 0)
{ // 如果elementData长度为0,就加1,否则就增加elementData.length的一倍
if ((adding = elementData.length) == 0)
{
adding = 1;
}
}
else
{
adding = capacityIncrement;
}
T[] newData = newElementArray(elementData.length + adding);
System.arraycopy(elementData, 0, newData, 0, elementCount);
elementData = newData;
}
public int size()
{
return elementCount;
}
@SuppressWarnings("unchecked")
public synchronized T remove(int location)
{
if (location < elementCount)
{
T result = (T) elementData[location];
elementCount--;
int size = elementCount - location;
// 把location + 1到最后整个拷贝到从location开始到最后
if (size > 0)
{
System.arraycopy(elementData, location + 1, elementData, location, size);
}
// 因为中间的某个删除的位置被覆盖,所以需要把最后一位直空
elementData[elementCount] = null;
modCount++;
return result;
}
throw new ArrayIndexOutOfBoundsException(location);
}
@SuppressWarnings("unchecked")
public synchronized T elementAt(int location)
{
if (location < elementCount)
{
return (T) elementData[location];
}
throw new ArrayIndexOutOfBoundsException(location);
}
// 有这个可以对java新特性for循环的支持
public Iterator<T> iterator()
{
return new SimpleIterator();
}
// 简单了实现迭代器
private class SimpleIterator implements Iterator<T>
{
int pos = -1;
int expectedModCount;
int lastPosition = -1;
SimpleIterator()
{
super();
expectedModCount = modCount;
}
public boolean hasNext()
{
return pos + 1 < size();
}
public T next()
{
if (expectedModCount == modCount)
{
try
{
T result = elementAt(pos + 1);
lastPosition = ++pos;
return result;
}
catch (IndexOutOfBoundsException e)
{
throw new NoSuchElementException();
}
}
throw new ConcurrentModificationException();
}
public void remove()
{
if (this.lastPosition == -1)
{
throw new IllegalStateException();
}
if (expectedModCount != modCount)
{
throw new ConcurrentModificationException();
}
try
{
Stack.this.remove(lastPosition);
}
catch (IndexOutOfBoundsException e)
{
throw new ConcurrentModificationException();
}
expectedModCount = modCount;
if (pos == lastPosition)
{
pos--;
}
lastPosition = -1;
}
}
}
分享到:
相关推荐
### Java数据结构与算法学习笔记知识点总结 #### 一、数据结构概述 数据结构是对数据的一种组织形式,它决定了数据的存储方式以及处理数据的方法。常见的数据结构包括但不限于数组、链表、栈、队列、二叉树、图等...
在数据结构的学习中,链表是一种非常基础且重要的概念,特别是在Java编程中。本文将深入探讨标题中的主题——“双向链表”。双向链表是一种特殊形式的链表,每个节点不仅包含指向下一个节点的指针,还包含一个指向前...
2. **线性数据结构**:线性数据结构如数组、链表、栈和队列是学习的基础。笔记可能详细讲解了数组的连续存储和随机访问特性,链表的动态内存分配和指针操作,栈的“后进先出”(LIFO)原则,以及队列的“先进先出”...
在《Java基础复习笔记05数据结构-栈》中提到,**栈**是一种特殊的线性表,它遵循“先进后出”(First In Last Out, FILO)的原则,即最后进入的数据项将最先被取出。可以将其想象成一个装书的盒子,如果想要拿到最...
Java学习笔记-Scoket.pdf Java学习笔记-Scoket.pdf是关于Java编程语言中Socket编程的学习笔记,涵盖了Socket编程的基础知识、Java中Socket的使用、Socket通信的原理及应用等方面的内容。 Socket编程的基础知识 在...
### Java数据结构与算法——学习笔记 #### 一、引言 在计算机科学领域,**数据结构**与**算法**是两个极其重要的概念。数据结构指的是数据的组织方式,而算法则是解决特定问题的一系列步骤。这两者是编程的基础,...
- `Stack`:继承自`Vector`,模拟栈结构。 **1.6 Set接口** - **特点**:无序且不允许重复元素。 - **实现类**: - `HashSet`:基于哈希表实现,元素无序。 - `LinkedHashSet`:基于哈希表+链表实现,维护元素...
本书“数据结构与算法分析-JAVA实现”专注于使用Java编程语言来阐述这些概念,这对于Java开发者来说是一份极其宝贵的学习资源。 首先,我们要理解数据结构。数据结构不仅仅是关于如何在计算机内存中组织数据,更是...
### Java数据结构与算法学习笔记知识点详解 #### 一、数据结构概述 数据结构是对数据的一种组织形式,它决定了数据的存储方式以及处理数据的方法。常见的数据结构包括但不限于数组、链表、栈、队列、二叉树、图等...
4. **异常处理**:Java通过try-catch-finally结构进行异常处理,有助于编写健壮的代码,提高程序稳定性。 5. **输入/输出**:Java的I/O流系统支持文件操作和网络通信,如FileReader、FileWriter、BufferedReader、...
本笔记主要涵盖了从第一章到第六章关于数据结构和Java语言的相关知识点。 第一章介绍了数据结构的基本概念,包括面向对象的特性如对象、继承和多态,对比了C++和Java中的指针差异。在Java中,垃圾回收机制自动管理...
本压缩包文件“《java学习》-Java 学习笔记.zip”包含了丰富的学习资源,帮助初学者和进阶者深入理解Java编程。 1. **Java基础知识** - **语法**:Java的基础语法包括变量、数据类型、运算符、流程控制语句(如if-...
韩顺平编写的《Java学习笔记》全面涵盖了Java的基础知识和发展方向,不仅适合初学者入门,也适合进阶开发者深入了解Java的各项技术栈。通过对本书的学习,读者能够掌握Java的核心概念、编程技巧以及实际应用场景,为...
Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。...Java学习笔记涵盖了这些核心知识点,通过深入学习和实践,你可以逐步掌握Java编程,并应用于实际项目开发中。
数据结构主要包括数组、链表、栈、队列、树、图、集合和哈希表等。在Java中,这些数据结构可以通过内置类如ArrayList、LinkedList、Stack、Queue、HashSet和HashMap等来实现。例如,`Graph.java`文件很可能包含了图...
【Java分布式应用学习笔记-谈JVM】 在Java分布式应用中,JVM(Java虚拟机)扮演着至关重要的角色。虽然有些人可能认为分布式系统与JVM的关系并不密切,但事实上,尤其是在大型分布式环境,如云计算服务平台,对Java...
在Java语言中,理解并应用数据结构和算法能够帮助开发者编写出更高效、更优化的代码。这篇读书笔记主要涵盖了以下几个方面: 1. **基本概念**: - 数据结构:它是组织和存储数据的方式,包括数组、链表、栈、队列...
### Java学习笔记及心得知识点详细解析 #### 标题:Java学习笔记及心得 #### 描述:Core Java 学习笔记及心得 pdf格式可打开。涵盖了java的基础入门知识,非常适合自学的及想深入学习理解的同学。 #### 标签:...
本文将基于“Felix---Java开发笔记20100628”这一主题,深入探讨Java及其相关的开发工具和技术栈,包括MyEclipse、Struts、Hibernate、Spring以及JavaScript和Ajax。 首先,Java是一种面向对象的、跨平台的编程语言...