`
linsyyang
  • 浏览: 5200 次
  • 性别: 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.指针的修改。重点在逻辑关系的理清,没啥好说的
分享到:
评论

相关推荐

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

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

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

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

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

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

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

    这个文档详细的介绍了利用栈和队列解决迷宫问题的步骤,对与初学者学习数据结构能很好的进行辅导

    MQ服务消息队列介绍

    (1)解压缩MQ客户端安装包:C84CJML.WebSphere MQ V6.0 Linux x86 Client.tar.gz,命令如下: tar -xvfz C84CJML.WebSphere MQ V6.0 Linux x86 Client.tar.gz (2)创建WebSphere MQ 必需的文件系统,命令如下:...

    论文研究-基于优先队列的时变网络最短路径算法.pdf

    提出了基于优先队列的时变网络最短路径算法,能克服传统最短路径...在随机生成的网络数据以及美国道路数据上的实验表明,基于优先队列的时变网络最短路径算法与经典方法相比,不仅能够求得精确解,运算速度也有所提高。

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

    采用优先队列式分枝限界法求解0/1背包问题,算法设计第五章,描述的很清晰,里面有完整代码,由于害怕你弄混,所以完整运行的代码参考我的博客文章即可

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

    N皇后问题解法,采用队列分支限界算法。c++编程。

    走迷宫 广度优先搜索与优先队列

    采用优先队列 由队列链表实现 1.0版本 解决简单的迷宫 从控制台输入格式:第一行输入m与n 表示迷宫行数列数。随后输入m行字符 由# . r a组成 表示墙壁 地面 地面(起点) 地面(终点) 输出0 表示无法解出 若能解出 会...

    链表队列栈VB.NET实现(面向对象方法)

    队列,栈 Cqueuelibrary LinkedListLibrary StackLibrary2 WindowsApplication1 是图形界面调用 &lt;br/&gt;(2)安装.Net Framework 2.0,下载地址:...

    n皇后问题java解

    n皇后问题的没有同义的解。用java语言实现n-queens算法

    堆排序、优先级队列(c++模板实现)

    使用c++模板实现的堆排序、优先级队列,在vs2010下编译运行通过。压缩文件里为两个工程文件,如果有vs2010的话解压缩打开sln文件就可以了,没有的话,新建工程将文件复制过去就ok了。如果有问题可以留言。

    杨辉三角(递归与队列解法)

    共三个C++文件,一个是递归解杨辉三角,并输出; 另两个是用队列解杨辉三角,并输出

    ActiveMQ RabbitMQ RokcetMQ 消息队列中间件视频教程

    解压缩码:javazx.com 作为消息中间件的MQ在java开发中起着举足轻重的地位,无论是ActiveMQ、RabbitMQ、还是RokcetMQ至少要会一个,否则别说自己是java程序员。Java自学网整理了目前行业最常用的消息中间件视频供...

    操作系统题目

    解:多级反馈队列调度算法能较好地满足各种类型用户地需要,对终端型用户而言,由于终端型作业用户所提交地作业大都属于交互型作业,作业通常比较短小,系统只要能使这些作业在第一队列所规定的时间片内完成,便可使...

    jave软件的应用

    为java应用的人员设计,感谢大家的下载,有利于大家的网站应用

    论文研究-基于(.pdf

    从分析NWR数据库Cassandra的写操作的(n,r,k)fork-join队列结构入手,给出了该类队列期望逗留时间的解析解和NWR数据库写延时的理论模型,可用于建立更完备的写延时结论。分别在模拟队列和Cassandra集群上验证了...

    WINCC7.0免狗破解安装方法

    1、安装windows组件:Message Quering(消息队列) 和 IIS 2、用虚拟光驱装载ISO文件,运行 WinCC_V70_SP2.exe 3、出现安装程序的对话框后,不要按任何按钮 4、在C盘根目录下,找临时文件夹 C:\{NUMBERS-NUMBERS-.....

    八数码 优先队列 分支限界 不在位优先

    随机给定一个3×3的矩阵,其元素为8个不同的数码,起始状态为S0,目标状态为Sg,要求用两种或以上的方法设计优先队列式分支限界法,寻找从初始状态变换到目标状态的最优解,说明不同的优先选择策略变换到最终状态用...

    论文研究 - 参数对Geoa / Geob / 1队列的影响:理论分析和模拟结果

    本文分析了具有固定大小a的批处理到达和固定大小b的批处理服务的离散时间Geoa / Geob / 1排队系统。 到达和服务都遵循几何分布随机发生。... 最后,我们探讨了参数对队列平均长度以及平均等待时间的影响。

Global site tag (gtag.js) - Google Analytics