Java数据结构的实现
1.基于数组的链表
package array; import java.util.Arrays; /**
* 基于数组的链表
*
* @author 王彪
*
*/
public class MyArrayList {
private static Object[] elements = null;
private static int size = 0;
private static final int DEFUAT_INITIAL_CAPACITY = 10; public MyArrayList() {
this(10);
} public MyArrayList(int initialCapacity) {
if (initialCapacity < 0) {
throw new IllegalArgumentException("输入容量有误");
}
elements = new Object[initialCapacity];
} //初始化数组
// 保存新元素
public void add(Object ele) {
// 数组的扩容问题
if (size == elements.length) {
Object[] temp = Arrays.copyOf(elements, elements.length * 2);
elements = temp;
}
elements[size] = ele;
size++;
} public Object get(int index) {
if (index < 0 || index >= size) {
throw new IllegalArgumentException("输入索引有误");
}
return elements[index];
} public void set(int index, Object newPlayerNum) {
if (index < 0 || index >= size) {
throw new IllegalArgumentException("输入索引有误");
}
elements[index] = newPlayerNum;
} public void remove(int index) {
if (index < 0 || index >= size) {
throw new IllegalArgumentException("输入索引有误");
}
for (int i = index; i < size - 1; i++) {
elements[i] = elements[i + 1];
}
elements[size - 1] = null;
size--;
} public String toString() {
if (elements == null) {
return null;
}
if (size == 0) {
return "[]";
}
StringBuilder sb = new StringBuilder(size * 3 + 1);
sb.append("[");
for (int i = 0; i < size; i++) {
sb.append(elements[i]);
if (i < size - 1) {
sb.append(",");
}
if (i == size - 1) {
sb.append("]");
}
}
return sb.toString();
} public int size() {
return size;
} public boolean isEmpty() {
return size == 0;
} public void clear() {
this.elements = new Object[DEFUAT_INITIAL_CAPACITY];
size = 0;
} }
2.双向链表
package linked;
public class MyLinkedArrayList {
protected Node first;
protected Node last;
protected int size;
public void addFirst(Object ele) {// 在头部增加
Node node = new Node(ele);
if (size == 0) {
this.first = node;
this.last = node;
} else {
node.next = this.first;
this.first.prev = node;
this.first = node;
}
size++;
}
public void addLast(Object ele) {// 在尾部增加
Node node = new Node(ele);
if (size == 0) {
this.first = node;
this.last = node;
} else {
this.last.next = node;
node.prev = this.last;
this.last = node;
}
size++;
}
public void remove(Object ele) {
Node current = this.first;
for (int i = 0; i < size; i++) {
if (!current.ele.equals(ele)) {
if (current.next == null) {
return;
}
current = current.next;
}
}
if (current == this.first) {
this.first = current.next;
this.first.prev = null;
} else if (current == this.last) {
this.last = current.prev;
this.last.next = null;
} else {
current.prev.next = current.next;
current.next.prev = current.prev;
}
size--;
}
@Override
public String toString() {
if (size == 0) {
return "[]";
} else {
StringBuilder sb = new StringBuilder(size * 3 + 1);
Node current = this.first;// 第一个节点
sb.append("[");
for (int i = 0; i < size; i++) {
sb.append(current.ele);
if (i != size - 1) {
sb.append(",");
} else {
sb.append("]");
}
current = current.next;
}
return sb.toString();
}
}
public class Node {
public Node(Object ele) {
this.ele = ele;
}
Node prev;
Node next;
public Object ele;
}
}
3.双向队列
package deque;
import linked.MyLinkedArrayList;
public class MyDeque extends MyLinkedArrayList {
public Object getFirst() {
return this.first.ele;
}
public Object getLast() {
return this.last.ele;
}
public void removeFirst(Object ele) {
super.remove(this.first);
}
public void removeLast(Object ele) {
super.remove(this.last);
}
public void addFirst(Object ele) {
super.addFirst(ele);
}
public void addLast(Object ele) {
super.addLast(ele);
}
}
4.堆
package stack; import array.MyArrayList; //栈
public class MyStack extends MyArrayList {
// 入栈
public void push(Object ele) {
super.add(ele);
} // 删除栈顶元素
public void pop() {
int index = super.size() - 1;
super.remove(index);
} // 查询栈顶元素
public Object peek() {
int index = super.size() - 1;
return super.get(index);
} }
Java数据结构的实现的更多相关文章
- Java数据结构之队列的实现以及队列的应用之----简单生产者消费者应用
Java数据结构之---Queue队列 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在 ...
- JAVA数据结构系列 栈
java数据结构系列之栈 手写栈 1.利用链表做出栈,因为栈的特殊,插入删除操作都是在栈顶进行,链表不用担心栈的长度,所以链表再合适不过了,非常好用,不过它在插入和删除元素的时候,速度比数组栈慢,因为 ...
- Java数据结构之树和二叉树(2)
从这里始将要继续进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来 ...
- Java数据结构之树和二叉树
从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...
- Java数据结构之线性表(2)
从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...
- Java数据结构之线性表
从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...
- java 数据结构 图
以下内容主要来自大话数据结构之中,部分内容参考互联网中其他前辈的博客,主要是在自己理解的基础上进行记录. 图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通过表示为G(V,E),其中,G标示 ...
- java 数据结构 队列的实现
java 数据结构队列的代码实现,可以简单的进行入队列和出队列的操作 /** * java数据结构之队列的实现 * 2016/4/27 **/ package cn.Link; import java ...
- java 数据结构 栈的实现
java数据结构之栈的实现,可是入栈,出栈操作: /** * java数据结构之栈的实现 * 2016/4/26 **/ package cn.Link; public class Stack{ No ...
- Java数据结构和算法
首先,本人自学java,但是只学习了java的基础知识,所以想接下来学习一下数据结构和算法,但是找了很多教材,大部分写的好的都是用c语言实现的,虽然知道数据结构和算法,跟什么语言实现的没有关系,但是我 ...
随机推荐
- Python正则表达
```# -*- coding:utf-8 -*-import re re - Support for regular expressions (RE).正则表达式是一个特殊的字符序列,它能帮助你方便 ...
- spring-boot 1.4.x遇到的cpu高的问题
如果你的spring-boot应用里tomcat线程耗cpu较高,并主要耗在做读取jar的操作上(堆栈类似下面),可能跟我们遇到同样的问题. CRC32.update(byte[], int, int ...
- java程序: 倒计时的小程序 (GridPane, Timer, Calendar, SimpleDateFormat ...)
倒计时程序 涉及到的东西: javafx简单的界面,布局,按钮,文本框,事件响应 java.util.Timer,用于定时 SimpleDateFormat用于在String和Date之间转换. ja ...
- CTF传送门
https://www.zhihu.com/question/30505597详细见知乎 推荐书: A方向: RE for BeginnersIDA Pro权威指南揭秘家庭路由器0day漏洞挖掘技术自 ...
- Jmeter压力测试入门操作
Jmeter压力测试入门 1. 前言 Jmeter 是Apache组织开发的基于Java的压力测试工具,开源并且支持多个操作系统,是一款很好的HTTP测试工具.本篇文章主要的目的是帮助没有接触过J ...
- 前端给div加滚动条样式修改
<!DOCTYPE html> <html lang="en"> <head> <meta chars ...
- 关于 “VMware Workstation 不可恢复错误- (vcpu-0)”
重装系统后第一次在 VMware Workstation 上创建虚拟机,结果出现了 VMware Workstation 不可恢复错误: (vcpu-0) 错误. 于是我们遵循它给出的提示,查看一下日 ...
- jquery控制滚动条
$(function () { $("table tr td a").css('white-space', 'nowrap'); $("div[id$=ctlScroll ...
- raid管理
raid管理 使用工具命令 storcli64 查看磁盘状态 storcli64 /c0 show 注:现在磁盘状态为UGood状态,表示可以直接制作raid 若磁盘状态为JBOD,则制作raid时会 ...
- 订阅无法在 ARM 模式下创建虚拟机,只能在 ASM 模式下创建 Azure VM 部署
问题描述 资源组所有者可以在新版 portal 创建经典模式的虚拟机,但是无法创建 ARM 模式的虚拟机. 问题现象 环境中有个相对权限比较高的账户,比如 account admin (以下简称为 A ...