Java语言中可以用数组处理一组数据类型相同的数据,但不允许动态定义数组的大小,即在使用数组之前必须确定数组的大小。而在实际应用中,用户使用数组之前有时无法准确确定数组的大小,只能将数组定义成足够大小,这样数组中有些空间可能不被使用,从而造成内存空间的浪费。 链表是一种常见的数据组织形式,它采用动态分配内存的形式实现。需要时可以用new分配内存空间,不需要时用delete将已分配的空间释放,不会造成内存空间的浪费。从逻辑结构来看, 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。 链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项)。从内存存储来看 , (静态)数组从栈中分配空间, 对于查找删除,但是自由度小 , 链表从堆中分配空间, 自由度大但是查找和管理比较麻烦。利用数组来组织数据结构 优点是:存储效率高,存取速度快。 但是,对于数据元素个数动态增长的情况,由于数组个数不能自由扩充(动态数组除外),一旦空间用完就不能再向里加入新元素,否则,就会导致系统停工。 利用链表则适用于插入或删除频繁、存储空间需求不定的情况,但是数据读取比较繁琐。
因此,在处理某些不确定的数据时,我们常常要用到队列,下面我简单介绍一下队列的特点。队列是一种数据结构,有点类似栈,只是在队列中第一个插入的数据项也会最先被移除,而在栈中,最后插入的数据项最先移除。队列的作用就像电影院前的人们站成的排一样:第一个进入附属的人将最先到达队头买票。最后排队的人最后才能买到票。队列可以实现数据的增加、删除、好了,接下来我将为大家介绍用数组和链表实现自定义队列的方法。
一、用数组实现队列
//测试类
public class ListTest {
public static void main(String[] args) {
// 创建一个数组对象
Mylist<Integer> list = new Mylist<Integer>();
for (int i = 0; i < 10; i++) {
int s = 10*i;
list.add(s);
}
//再添加元素
list.add(100);
list.modify(10, 100);
// 取出元素
for (int i = 0; i < list.size(); i++) {
int s = list.get(i);
System.out.println(s);
}
}
}
/**
* 创建一个数组队列
*
* @author 闭耀尧
*
*/
public class Mylist<E> {
// 创建一个空的初始数组
Object src[] = new Object[0];
Object stroke[]=new Object[500];
/**
* 给数组添加元素
*
* @return
*/
public void add(E s) {
Object dest[] = new Object[src.length + 1];
// 将初始数组的值赋给新创建的数组中
for (int i = 0; i < src.length; i++) {
dest[i] = src[i];
}
// 将心数组的值赋给初始数组的最后一个位置
dest[src.length]=s;
src = dest;
}
/**
* 根据下标获取数组中的元素
* 返回所获取的个数
*/
public E get(int index) {
E s=(E)src[index];
return s;
}
/**
* 根据下标和元素名修改数组元素
*/
public void modify(int index,E s) {
src[index]=s;
}
/**
* 根据元素名和下标插入数组
*/
public void insert(int index, E s) {
src[index]=s;
}
/**
* 根据元素名和下标删除数组
*
*/
public void delete(int index, E s1) {
E s=(E)src[index];
}
/**
* 统计数组大小
* 返回所获取的大小
*/
public int size() {
return src.length;
}
}
二、2.用链表实现的队列
//设置节点
public class LinkNode {
private Object obj;// 节点内数据对象
private LinkNode child;// 对下一个节点的引用
private LinkNode parent;// 对下一个节点的引用
public LinkNode(Object obj) {
this.obj = obj;
}
public void setObject(Object obj) {
this.obj = obj;
}
public Object getObject() {
return obj;
}
public void setChild(LinkNode child){
this.child =child ;
}
public LinkNode getChild() {
return child;
}
public void setParent(LinkNode parent){
this.parent =parent ;
}
public LinkNode getParent() {
return parent;
}
}
//链表实现队列
public class NodeQueue {
public static LinkNode front = null;// 第一个节点
public static LinkNode last = null;// 最后一个节点
/**
* 程序入口
*
* @param args
*/
public static void main(String[] args) {
NodeQueue nq = new NodeQueue();
nq.add("aa");
nq.add("bb");
nq.add("cc");
nq.ModiFyLinkNode(0, "更改");
// nq.inserLinkNode(2, "插入");
nq.deleteLinkNode(2);
nq.printLinkNode(front);
}
// 添加节点
public void add(Object object) {
// 创建一个新的节点
LinkNode node = new LinkNode(object);
if (null == front) {// 如果链表为空
front = node;
last = front;
} else {
last.setChild(node);
node.setParent(last);
last = node;
}
}
// 根据索引删除元素
public void deleteLinkNode(int index) {
if (this.getLinkLenght() < index || index < 0) {
throw new RuntimeException("下标越界:" + index + "size:"
+ this.getLinkLenght());
} else {
// 得到当前索引位置的节点
LinkNode node = this.getLinkNode(index);
// 得到父节点
LinkNode f_node = node.getParent();
// 得到子节点
LinkNode c_node = node.getChild();
if (f_node == null) {
front = c_node;
} else if (c_node == null) {
f_node.setChild(null);
} else {
f_node.setChild(c_node);
c_node.setParent(f_node);
}
}
}
// 根据索引和对象名修改节点
public void ModiFyLinkNode(int index, Object object) {
if (this.getLinkLenght() < index || index < 0) {
throw new RuntimeException("下标越界 : " + index + " size: "
+ this.getLinkLenght());
}
LinkNode node = this.getLinkNode(index);
node.setObject(object);
}
// 获取节点对象
public LinkNode getLinkNode(int index) {
if (this.getLinkLenght() < index || index < 0) {
throw new RuntimeException("下标越界:" + index + "size:"
+ this.getLinkLenght());
} else {
int num = 0;
LinkNode node = front;
while (num != index) {
node = node.getChild();
num++;
}
return node;
}
}
// 插入节点
public void inserLinkNode(int index, Object object) {
if (this.getLinkLenght() < index || index < 0) {
throw new RuntimeException("下标越界" + index + "size:"
+ this.getLinkLenght());
} else {
// 创建新节点
LinkNode newnode = new LinkNode(object);
// 得到当前节点
LinkNode node = this.getLinkNode(index);
if (index == 0) {// 如果链表没有节点
front = newnode;
} else if (index == this.getLinkLenght()) {// 如果为最后一个节点
node.setChild(newnode);
newnode.setParent(node);
} else {
// 得到父节点
LinkNode fnode = node.getParent();
fnode.setChild(newnode);
newnode.setChild(node);
}
// 新的引用关系
newnode.setParent(front);
node.setParent(newnode);
}
}
// 获取节点数,返回链表长度
public int getLinkLenght() {
int count = 0;
if (front == null) {
return count;
}
LinkNode node = front.getChild();
while (null != node) {
count++;
node = node.getChild();
}
return count + 1;
}
// 遍历链表方法
public void printLinkNode(LinkNode root) {
if (null != root) {
Object data = root.getObject();
System.out.println(data);
LinkNode temp = root.getChild();
printLinkNode(temp);
}
}
}
分享到:
相关推荐
本话题主要探讨了两种常用的数据结构——数组和链表——在实现队列这一线性数据结构时的应用。队列是一种先进先出(First In First Out, FIFO)的数据结构,它的主要操作包括入队(enqueue)、出队(dequeue)以及...
队列和栈可以使用数组或链表实现,而数组和链表可以用于实现队列和栈。 数组、链表、队列、栈四种数据结构之间存在着紧密的联系,但同时也存在着许多区别。正确地选择和使用这些数据结构是非常重要的,它可以提高...
Python 实现栈和队列 栈和队列是两种常用的数据结构,在编程设计中广泛应用。...本文介绍了如何使用 Python 实现栈和队列,包括使用数组和链表两种方法。栈和队列是两种常用的数据结构,在编程设计中广泛应用。
本篇文章将深入探讨如何用数组和链表两种数据结构来实现队列。 ### 数组实现队列 数组实现队列的优势在于访问速度快,因为数组是连续存储的,可以通过下标直接访问元素。但数组的大小是固定的,所以在创建时需要...
数组、链表、队列、栈数据结构特点,各自优点和缺点 在计算机科学中,数据结构是指用于组织和存储数据的方式。常见的数据结构包括数组、链表、队列、栈等。每种数据结构都有其特点、优点和缺点,本文将对这些数据...
"go语言通过数组和链表的方式实现队列" 从给定的文件信息中,我们可以生成以下知识点: 1.队列的定义:队列是一种特殊的线性表,只能在队列的尾部添加元素,在队列的头部删除元素,先进先出(FIFO)。 2.go语言中...
队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,只允许在表的后端(rear)进行插入操作,下面介绍一下java使用数组和链表实现队列的示例
队列可以使用数组或者链表来实现,队列的应用场景非常广泛,如购物队列、打印队列等。 线性表是具有n个数据元素的有限序列,線性表的数据元素可以由若干个数据项组成。線性表有顺序存储结构和非顺序存储结构两种...
本文将深入探讨如何使用C语言实现数组形链表,并详细讲解其相关接口。 首先,我们需要定义数组形链表的数据结构。它通常包含一个数组,用于存储元素,以及一个指示当前数组容量的变量。当数组满时,我们可以通过...
- **链表的优势**:适合需要频繁进行插入和删除操作的应用场景,如任务队列管理等。 - **链表的劣势**:查询效率低,不适合需要频繁查询数据的场景。 #### 关于顺序表的改进 对于基于数组的顺序表,可以通过引入...
链表实现的循环队列在处理满队列和空队列时与数组实现有所不同,因为链表的节点可以动态增加和删除,所以无需像数组那样进行特殊的重置操作。 在C++中,模板(template)是泛型编程的重要工具,它可以让我们创建...
数据结构-数组&链表&队列&堆栈代码示例,附有详细的注释说明,简单移动,适合初学者参考学习。
超级数组和链表及栈队列
在编程语言中,数组通常被内置支持,易于理解和使用,而链表则通常需要通过指针和结构体等概念来实现,相对复杂。但考虑到其灵活性,链表在处理动态数据集时显得尤为有用。 总结来说,选择数组还是链表主要取决于...
常见的数据结构(栈、队列、数组、链表和红黑树) 数组和链表.pdf
arithmetic java算法冒泡排序、二叉树、数组、链表、队列学习简单示例 private static void mpSoft(String [] data) { for (int i = 0; i ; i++) { System.out.println(Arrays.toString(data)); for (int j = 0; ...
在实际应用中,除了数组和链表之外,针对不同需求还有多种数据结构的选择,例如栈、队列、树、哈希表等,但无论如何,正确理解数组和链表的原理与适用场景,对于高效的数据处理和算法实现仍然是不可或缺的。...
经过一上午的学习,对数据结构有了新的认识和理解 数组 数组是由有限个相同类型的变量所组成的有序集合,...栈是一种线性逻辑结构,可以使用数组实现,也可以使用链表实现。包含入栈还有出栈操作,遵循先入后出的原则(F
在计算机科学中,数据结构是组织、存储和处理数据的方式,它们是算法设计的基础。...在实际编程中,Java提供了ArrayList和LinkedList两种内置的列表实现,分别基于数组和链表,可以根据需要选择使用。
而链表由于其插入和删除操作的高效性,更适合频繁进行插入和删除操作且数据量变化较大的场景,如实现队列、栈和图等数据结构。 综上所述,数组和链表作为基础数据结构,它们各自具有独特的优缺点。在进行算法设计和...