`
linsyyang
  • 浏览: 5425 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

队列的再解

阅读更多
数据有两种基本的存储结构,一种是连续的,用数组实现。一种是不连续的,用链表实现。数组中的数据是有统一的索引值的,方
便查找但是数组的长度是在一开始就必须要定义好的,所以,添加数据有限,并且当数据比较少时,也会比较浪费内存空间。而链
表则是通过节点,一方面存储数据,一方面每个节点指向下一个节点,一环扣一环地实现多个数据的存储。查找时因为没有统一的
索引值而效率较慢,但添加数据和删除数据时确只要改变之多两个节点的存储数据,并且能够节省内存。因此,我们可以根据需要
的不同来决定我们存储方法的选择。

另外,为了实现数据的存储,我现在所接触到最为方便的就是队列了,队列能够实现基本的数据存储、删除、查询和修改功能,而
也能随加入进去的数据的多少来随意变更长度。在之前,以数组实现过基本的队列功能,今天又试了一下用链表来实现队列的功能。

我觉得用链表实现队列的最主要的问题是链表的结构和实现队列的算法。
首先是链表的结构,链表的基本组成单位是节点,每一个节点又由节点存储的数据和指向下一个节点的指针两个部分。由于java中
没有指针这一数据类型,因此,指向下一个节点的指针可以直接由下一个节点来代替,这就 组成了节点类的两个基本属性。我们为了
方便可以直接将属性设为公有的。实际上一个链表就是一个队列,只要实现队列的能够完成的基本方法也就可以当成一个链表来用了。
总之,在我眼里用链表实现的队列实际上就是一个链表,其基本单位也是节点,基本的方法也是数据的增删查改。

这是我的节点类
public class LinkNode {
public  Object data;
public  LinkNode next;

public LinkNode(Object obj){
this.data=obj;
}

public LinkNode(){
}
}

然后就是实现方法的算法了。我先把代码抄上
/**
* 链表类,实现链表数据的添加,删除,查找和修改
* @author linsy
*
*/
public class MyLink<E> {
private LinkNode root;
private LinkNode last;
private LinkNode next;

/**
* 向链表中添加数据
* @param e 添加的对象
*/
public void add(E e){
LinkNode ln=new LinkNode(e);//构造函数创建节点对象
if(root==null){ //当根节点为空值时,root设为刚创建的节点
this.root=ln;
}else{ //根节点不为空,将尾节点的下一个节点赋给新节点
this.last.next=ln;
}
this.last=ln; //将尾节点赋给新节点
}

/**
* 向指定位置中添加数据
* @param e 添加的对象
* @param index 添加的位置
*/
public void add(E e,int index){
LinkNode ln=new LinkNode(e);//当根节点为空时,调用add()方法
if(index==0){
this.add(e);

}else{/*否则,查找到第index-1个节点,新节点指向index个节点,index-1指向新节点*/
LinkNode temp=this.search(index-1);
ln.next=temp.next;
temp.next=ln;
}
}

/**
* 计算链表长度
* @return 链表的长度值
*/
/*
定义计数器,从根节点开始遍历链表,每访问一个节点即将节点指向下一个节点,计数器加一,最后返回计数器值
*/
public int getCount(){
int count=0;
LinkNode temp=new LinkNode();
temp=root;
while(temp!=null){
temp=temp.next;
count++;
}
return count;
}

/**
* 查找第index个节点
* @param index 要查询的节点在链表中的位置
* @return 返回第index个节点
*/
/* 与取得链表大小的方法类似,遍历链表,当count值达到index时,返回当前节点
*/
public LinkNode search(int index){
if(index>this.getCount()){
System.out.println("查找失败");
return null;
}else{
LinkNode temp=this.root;
//Object e[]=new Object[getCount()];
for(int i=0;i<index;i++){
//e[i]=temp.data;
temp=temp.next;
}
return  temp;
}
}

/**
* 删除第index个数据
* @param index 要删除的节点的位置
*/
/*  先查找到第index-1个节点,然后将该节点的指针指向它的下下个节点*/
public void delete(int index){
int count =this.getCount();
LinkNode temp=this.search(index-1);
if(temp.next.next==null){
temp.next=null;
}else{
temp.next=temp.next.next;
}
count--;
}

/**
*
* @return 返回链表数据组成的数组
*
*/
/*通过数组实现,先建立一个同链表一样大小的数组,然后边遍历链表边将节点数据存入数组,最后返回数组*/
public E[] getMyLinkObject(){
LinkNode temp=this.root;
Object e[]=new Object[getCount()];
for(int i=0;i<getCount();i++){
e[i]=temp.data;
temp=temp.next;
}
return (E[]) e;
}
}

遇到的基本问题大致有:
1.空指针异常。在添加和删除方法是特别容易遇到空指针异常的状况,一般都是因为root为空或者next为空,只要弄清楚了空
  指针出现的位置,问题还是比较容易解决的。
2.返回链表时到底要返回什么。当然最好的就是返回所有的节点或者节点数据,而实现查询的最好工具是数组,很自然的,只有用
数组返回节点数据。但是返回值又只能有一个,不能在链表的返回方法中直接for循环返回多个节点,而只能返回数组,再在外部
主函数中再逐个输出。
3.泛型。问题还存在着,虽然已经实现了基本功能,但改错都是按系统提示的方法一个一个试才成的。有时间再看一下泛型方面的
  东西吧。
4.指针的修改。重点在逻辑关系的理清,没啥好说的
分享到:
评论

相关推荐

    数据结构栈和队列解决迷宫问题

    数据结构栈和队列解决迷宫问题 本文档详细介绍了利用栈和队列解决迷宫问题的步骤,对于初学者学习数据结构能很好的进行辅导。本文档主要涉及到数据结构的两个重要概念:栈和队列,并介绍了如何使用这两个数据结构来...

    迷宫问题用队列解决

    4. 若队列为空但未找到终点,则说明无解。 在实际编程实现中,我们还需要考虑如何表示路径。一种常见方法是通过记录每个节点的前驱节点,从而在找到终点后反向追踪得到最短路径。此外,为了提高效率,可以采用剪枝...

    采用优先队列式分枝限界法求解0/1背包问 题.pdf

    优先队列式分枝限界法是分枝限界法的一种改进形式,它利用优先队列(通常是最小堆或最大堆)来存储待处理的节点,使得算法在选择下一个处理节点时,总是选择一个最有可能产生最优解的节点进行展开。这种策略可以有效...

    算法设计中关于优先队列式分支限界法解装载问题的代码

    分支限界法中的优先队列式分支限界法解装载问题

    Fastadmin消息队列插件.zip

    为了使用这个插件,用户无需解压缩文件,只需在Fastadmin的插件管理界面进行安装。安装过程通常包括上传插件文件、激活插件和配置相关参数等步骤。配置参数可能涉及到队列驱动的选择、连接信息以及邮件和短信服务的...

    数据结构实验——队列的实现及应用(循环队列舞会配对)

    1、掌握队列的类型定义方法。 2、理解和掌握循环队列解决假溢出的方法。 二、实验内容 1、利用循环队列模拟舞伴配对问题:在舞会上,男、女各自排成一队。舞会开始时。依次从男队和女队的队头各出一人配成舞伴。如果...

    n皇后问题(队列分支限界法)

    通过队列分支限界法解决n皇后问题,不仅可以找到所有解,而且由于其广度优先的特性,往往能找到第一个解的速度较快。这种方法对于理解和优化问题求解算法具有重要意义,也是算法设计和分析课程中的经典练习。

    消息队列 入门实例

    3. 解耦合:生产者和消费者之间无需直接通信,降低了两者之间的依赖性,使得系统更加模块化,易于扩展和维护。 4. 可靠性:消息队列通常提供消息持久化功能,即使生产者或消费者出现故障,也能保证消息不丢失。 在...

    一般解空间的队列式分支限界法对于给定的布线区域,编程计算最短布线方案。

    一般解空间的队列式分支限界法 Description 试设计一个用队列式分支限界法搜索一般解空间的函数。该函数的参数包括结点可行性 判定函数和上界函数等必要的函数,并将此函数用于解布线问题。 印刷电路板将布线区域...

    消息队列.zip

    - 解耦合:生产者和消费者不必同时在线,也不必使用相同的编程语言或运行在同一环境中,降低了系统之间的依赖性。 3. **常见消息队列产品**: - RabbitMQ:开源MQ,基于AMQP协议,广泛应用于各种场景。 - Apache...

    消息队列简介-培训材料

    总结来说,消息队列是现代分布式系统中的关键组件,它通过异步处理、解耦合和流量控制等方式,帮助构建高效、可靠和可扩展的系统。不同的消息队列产品如ActiveMQ、RabbitMQ、Kafka和RocketMQ各有优势,适用于不同的...

    APC年龄时期队列模型大论文介绍.pdf

    APC模型由于年龄、时期、队列效应间存在线性关系(时期=年龄+队列),在使用传统回归方法时会出现无法得到唯一解的“不可识别”问题。研究人员在尝试解决这一难题时提出了多种方法,但迄今为止没有达成广泛共识。 ...

    基于C语言的数据结构队列模板

    这种设计可以解决定容队列扩展性不好的问题,当一个块满时,可以动态地分配新的块。在C语言中,块链队列通常通过结构体和指针来实现,结构体包含数据和指向下一个块的指针。 3. 链表队列:链表队列是使用链表作为...

    消息队列的简单讲解

    3. **解耦合**:生产者和消费者只需关心消息的生产和消费,而不必了解对方的具体实现,增强了系统的灵活性。 4. **容错性**:如果消费者处理消息时出现错误,消息可以被重新放回队列,稍后再次尝试处理,保证了系统...

    Windows Service 通信- 消息队列

    2. **解耦合**:消息队列将服务之间的直接依赖关系降低到最低。服务只需要向队列发送消息,而无需知道消息的接收者是谁,这增强了系统的可扩展性和灵活性。 3. **容错性**:如果接收方服务暂时无法处理消息,消息...

    数据结构作业(八皇后问题以及队列模拟器)

    在这个“数据结构作业”中,我们有两个主要的实践项目:八皇后问题的解决方案和队列模拟器的实现,这两个项目都是使用C++编程语言完成的。 首先,八皇后问题是一个经典的回溯法应用实例,它要求在8x8的棋盘上放置8...

    巡游队列_测试路径_巡游队列_

    它通常结合了这两种策略的优点,旨在避免局部最优解,并确保遍历的全面性。在测试路径时,巡游队列能够生成所有可能的路径,或者找到最优路径,这取决于具体的应用场景。 首先,我们要理解巡游队列的构建过程。巡游...

    采用消息队列实现客户端与服务端的通信

    5. **解耦合**:生产者和消费者不必知道对方的存在,降低了系统的耦合度。 **消息队列的类型与选择:** 常见的消息队列有RabbitMQ、Apache Kafka、ActiveMQ、Redis等,每种都有其特性。例如,RabbitMQ适合小型项目...

    栈和队列迷宫

    在解谜过程中,开发者可能首先创建一个表示迷宫的二维数组,每个位置代表一个节点,可以是墙或可通行的空间。然后,利用栈或队列进行搜索。 对于栈的DFS实现,通常会用一个辅助栈来存储当前路径,每次进入一个新...

Global site tag (gtag.js) - Google Analytics