`
daihongtao110121
  • 浏览: 15691 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

队列的总结

    博客分类:
  • java
 
阅读更多
        队列的总结之我的理解
一:队列的定义:
       生活中我们知道,一对人排列那么就是一个队列。那么在计算机中呢。我们是否可以猜想队列也是由一些元素排列组成的呢。。在计算机种可以有数组存储数据和链表存储数据。那么队列也就分为两个队了;
二:队列可以分为数组队列和链表队列
    数组队列:数组本身就是按书序的时候排列的组合,当我们给他进行一些包装的。加一些方法,那么这时候数组也就是队列了。当然我们也可以理解成单个数组也是队列、
   链表队列:链表是由结点构成,给节点加上一些方法那么也就构成了队列。同样一个结点也是队列

三:队列的构建:
  三.1:数组队列的构建 :思路:1:先建一个类,然后创建一个内部用来创建数组的方法   2:给数组添加方法,实现队列    添加方法代码如下

    /**创建一个内部用来存储的数组*/
private MyShape[] srcA=new MyShape[0];
        /**
         * 调用此方法,向队列中放入一个MyShape里的对象  
         * @param m 一个MyShape对象
         */
public void add(MyShape m){
//新建一个数组,使得长度比原数组多一
MyShape[] srcB= new MyShape[srcA.length+1];
//将要加入的对象放在数组的最后一位
srcB[srcA.length]=m;
//将以前的数组放在新数组中
for(int i=0;i<srcA.length;i++){
srcB[i]=srcA[i];
}
//将新数组指向原数组,对换
srcA=srcB;
}

  得到队列长度的方法代码如下
/**
* 得到队列的长度
* @return  队列的长度
*/
public int size(){
return srcA.length;
}

然后在写取得队列指定值的对象  代码如下
/**
* 取得队列中的一个值的对象
* @param index为对象取得的位置
* @return 是一个MyShape对象
*/
public MyShape get(int index){
MyShape m=srcA[index];
return m;
}



这样数组队列就创建完了。
同时我们还可以使用泛型。那样的话我在使用时候我们不用使用一个对象就建一个队列,就可以泛型中改变对象就行了。泛型的时候就只要在队列后面加一个<E>就行了。
并且还可以对队列进行优化。1:加上删除方法,在指定队列插入的方法等等;
具体代码如下
/**
* 实现队列的泛型      
* @author 戴红涛  2013-4-16
*/
public class MySet<E> {
private int count=100;
private int increase=10;
/**
* 定义一个构造方法,用来传递count,increase
* @param incount是初始值,
* @param increase 增长速度
*/
public MySet(int count,int increase){
this.count=count;
this.increase=increase;
}
/**
* 无参的构造器的方法
*/
public MySet(){
this.count=100;
this.increase=10;
}
/**
* 定义有一个参数的构造方法
* @param count
*/
public MySet(int count){
this.count=count;
}


//队列内部初始用来封装对象的数组,长度为
private Object[] srcA=new Object[count];
     /**
      * 向队列中加入一个对象
      * @param e
      */
          public void add(E e){
          //新建一个数组,长度是原数组的长度加10
          Object destA[]=new Object[srcA.length+increase];
          //将要加入的对象放到新数组的最后一个位置
          destA[srcA.length]=e;
          //将原数组的东西复制到新数组中.,用java机制里面的方法
          System.arraycopy(srcA, 0, destA, 0, srcA.length);
          //指向新数组
          srcA=destA;
          }
          /*
           * 取得队列中指定值的一个对象
           */
          public E get(int index){
          E st=(E)srcA[index];
          return st;
          }
          /**
           * 得到队列中的长度
           * @param e
           */
          public int size(E e){
          return srcA.length;
          }
          /**
           * 定义插入方法
           */
          public void insert(int index){
         
          }
}

     插入方法的具体就可以自己去完成了。。
三:2:链表队列的构建。
   链表队列与数组队列的不同就是在建链表队列的时候要先建一个节点类,节点类有数据,指向的属性;
双向链表节点类的创建代码如下
package com.dht418;
/**
* 双向向链表的节点类的创建
* @author 戴红涛 2013-4-18
*
*/
public class LinkNodev1 {
       private Object obj;//节点类数据对象
       private LinkNodev1 child;//指向下一个节点;
       private LinkNodev1 parent;//指向上一个节点
       //在创建对象的时候就传入数据对象
       public LinkNodev1(Object obj){
       this.obj=obj;
       }
       //用setter,getter方法分别对节点的封装进行访问
       public Object getObj( ){
       return obj;
       }
       public void setObj(Object obj){
       this.obj=obj;
       }
       public LinkNodev1 getChild(){
       return child;
       }
       public void setChild(LinkNodev1 child){
       this.child=child;
       }
       public LinkNodev1 getParent(){
       return parent;
       }
       public void setParent(LinkNodev1 parent){
       this.parent=parent;
       }
}
这里面通过了对其属性进行了封装,通过setter和getter方法设置和取得,以保证属性不被外面随便调用;


节点类的属性创建好了以后,就是队列的实现了
插入节点代码:
/**
  * 插入结点
  * @param obj 要插入结点的对象
  */
public void add(Object obj){
//创建一个新节点  ,,在后面括号里要有数据
LinkNodev1 node =new LinkNodev1(obj);    
if(front==null){   //头结点为空结点。。。。
front=node;     //将要介入的节点 赋值给头结点。。
last=front;     //头结点和尾结点指向同一个节点
}
else{
      last.setChild(node);   //在尾节点后面加一个节
       node.setParent(last);  //新加入的节点为前面的尾结点
       last = node;    //一定要记得将新加入的节点赋值给尾结点
}

}

得到链表的长度代码:
/**
* 得到链表的长度
* @return 链表的长度
*/
public int getLength(){
int count =0;   //计数器
if(front==null){
return count;
}
//不能用下面的方法进行。。。因为这样的画,头结点就发生     了,而在链表中头结点只能是一个,所以不能改变,
//只能用一个临时变量指向头指针,然后让这个头指针进行移动
// while(front!=null){
// front.setChild(front);   //将头指针后移
// count++;     //计数器加一
// }
// return count ;
LinkNodev1 node =front.getChild();
while(node!=null){
count++;
node=node.getChild();
}
return count +1;
}

在这里我开始的时候放了一个错误
开始的时候就直接让头结点后移。然后返回头结点,就如上面代码注释掉的。然后后面发现那样的话就变成死循环了,当时在想思路没错,为什么得不到自己想要的结果呢。后面了解到原来是:在链表中头结点只有一个。按我这种方法进行的话,那么头结点一直在变,后面遍历的时候也就不知道是哪个头结点了。。我报保存了就是为了防止以后的错误。

根据索引取出节点的代码如下:
/**
* 根据索引取出节点
* @param index  第几个节点
* @return   根据索引返回的节点
*/
public LinkNodev1 getLinkNodev1(int index){
if(this.getLength()<index||index<0){    //判断链表长度。与索引的大小关系
throw new java.lang.RuntimeException("下表越界"+index+",size:"+this.getLength());
}
else{
int num=0;    //计算器
// LinkNodev1 node =new LinkNodev1("aaa");   //在实例化的时候。。括号里面一定要有参数
// node=front;
LinkNodev1 node =front;    //创建一个临时变量。同时指向头指针
while(num!=index){    //计算器不等于指定的位置大小
node=node.getChild();  //将该指针的位置下移一位
//下面得到索引的方法是错误的。。。。永远都只是跟节点的下位
// node=front.getChild();
num++  ;
}
return node;  //返回此时头指针移到的位置
}
}

遍历链表的方法代码:
/**
     * 遍历链表的方法
     * @param root :链表的根节点
     */
    public void printLinkListv2(LinkNodev1 root){
    if(root!=null){    //根节点不为空
    Object data=root.getObj();  // 取得根节点的数组
    System.out.println("节点内容为:"+data);    //输出根节点的数据
    LinkNodev1 node =root.getChild();           //取得根节点赋值给一个节点
    printLinkListv2(node);      //递归调用打印方法,直到全部输出为止
    }
   
    }

要是还要加其他的方法,如在指定索引下的插入
/***
* 在指定索引下插入节点
* @param index 指定索引
* @param obj 要插入的节点
*/
    public void insertIndexObj(int index,Object obj){
   
    if(this.getLength()<index||index<0){    //判断链表长度。与索引的大小关系
throw new java.lang.RuntimeException("下表越界"+index+",size:"+this.getLength());
}else{
    //创建一个新节点
    LinkNodev1 newNode = new LinkNodev1(obj);
    //得到当前索引位置的节点
    LinkNodev1 node=this.getLinkNodev1(index);
    if(index==0){   //在开始的时候加入,直接把新节点赋值给头结点
    front=newNode;
   
    }
    else{
    //得到索引位置的父节点
    LinkNodev1 fNode=node.getParent();
    if(fNode!=null){
    //将要插入的新节点插入到这两个节点之间
    fNode.setChild(newNode);
    newNode.setParent(fNode);  //因为是双向表,所以要将父节点和子节点同时写上
    }
    }
    //加入以后设置新的链接关系
    newNode.setChild(node);
    node.setParent(newNode);
    }
    }

这样链表队列也就创建成了
测试一下吧。。。。代码如下
public class LinkListv2 {
public static LinkNodev1 front= null;    //定义头结点,并把初始化
public LinkNodev1 last=null;      //定义尾结点,同样的初始化

/**
* @param 主函数,程序的入口
*/
public static void main(String[] args) {
         //加入节点
LinkListv2 list=new LinkListv2();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("bbb");
//插入结点
list.insertIndexObj(1, "000");
//遍历链表
    list.printLinkListv2(front);

运行结果。。。



要是还要改正,就添加其他的方法去吧。。

我对这两种队列的理解就是这些了,有更好的希望可以和大家学习
  • 大小: 8.3 KB
分享到:
评论

相关推荐

    数据结构队列总结

    数据结构中的队列是一种线性数据结构,遵循先进先出(First In First Out,FIFO)的原则,即最先进入队列的元素将是最先被处理的。与栈不同,队列允许在一端(通常称为队尾)进行元素的插入,在另一端(通常称为队头...

    循环队列的总结

    循环队列是一种线性数据结构,它在计算机科学中被广泛应用于数据缓存、消息队列等场景。相比于传统的队列,循环队列利用数组的循环特性,避免了队列满或空时需要重新分配内存的问题,提高了空间利用率和操作效率。在...

    GCD 总结-队列和任务的理解

    GCD的核心概念包括队列和任务,本篇文章将深入探讨这两种核心元素,以及如何在实际项目中运用它们。 ### 1. GCD 的基本概念 GCD 是基于 C 语言的,但在 Objective-C 和 Swift 中都可以使用。它是Apple的系统级并发...

    数据结构线性表、栈和队列、串的实验报告

    - **循环队列**:顺序队列的一种优化形式,通过改变队头和队尾指针的移动方式,避免队列中的“假溢出”现象。 - **链式队列**:通过一组任意的存储单元存储队列中的元素。 **相关算法:** - **入队**:在队列尾部...

    对几种队列的总结

    本篇文章将对几种常见的队列进行深入的总结和探讨。 首先,我们来看最基本的**线性队列**,也称为顺序队列。线性队列在内存中通常是通过数组实现的,它的入队操作在队尾进行,出队操作在队头进行。当队列满时,可以...

    浅谈Java消息队列总结篇(ActiveMQ、RabbitMQ、ZeroMQ、Kafka)

    "Java 消息队列技术总结" Java 消息队列是分布式系统中重要的组件,主要解决应用解耦、异步消息、流量削锋等问题,实现高性能、高可用、可伸缩和最终一致性架构。常用的消息队列有 ActiveMQ、RabbitMQ、ZeroMQ、...

    C语言_初始化队列+入队列+出队列+销毁队列

    #### 四、总结 本篇介绍了如何使用C语言实现链式队列的基本操作,包括初始化队列、入队列、出队列以及销毁队列。链式队列是一种非常实用的数据结构,在实际应用中可以有效地管理动态变化的数据集。通过对这些基本...

    PI解决队列堵塞问题

    #### 五、总结 通过上述步骤,我们可以有效地解决SAP PI中的队列堵塞问题。重要的是要密切关注队列的状态,并及时采取措施处理堵塞情况,以确保系统的稳定运行。此外,熟悉SMQ2和其他监控工具的功能,能够帮助我们...

    应用题及知识点总结 第四章队列

    应用题及知识点总结 第四章队列应用题及知识点总结 第四章队列应用题及知识点总结 第四章队列应用题及知识点总结 第四章队列应用题及知识点总结 第四章队列应用题及知识点总结 第四章队列应用题及知识点总结 第四章...

    数据结构 队列部分 队列的删除等相关操作

    总结 在本节中,我们讨论了队列的删除操作,并对其进行了详细的分析。我们了解了队列的基本概念,队列的删除操作,队列的实现,队列的添加操作和队列的遍历操作。通过对队列的理解,我们可以更好地理解和应用队列在...

    优先队列、图等总结及习题.docx

    优先队列、图等总结及习题 优先队列是一种特殊的队列结构,它的出队顺序是根据元素的优先权决定的,而不是元素入队的顺序。优先队列的操作包括查找、插入和删除,删除操作是根据优先权高或低的次序进行的。 一、...

    链式队列的基本运算

    链式队列是一种在计算机科学中广泛...- **总结与改进**:总结实验结果,提出可能的优化策略和未来改进的方向。 通过学习和实践这些基本操作,可以深入理解链式队列的原理,并为更复杂的算法和数据结构打下坚实的基础。

    队列_队列、C语言_

    总结来说,这个项目提供了使用C语言实现队列的实例,包括创建、插入、删除、检查队列状态和销毁队列的全部功能。通过分析这些文件,你可以深入理解C语言中如何手动构建和管理数据结构,这对于学习和理解操作系统、...

    C#消息队列发送及接收

    在IT行业中,消息队列(Message ...总结来说,C#中的MSMQ为开发者提供了一种高效、可靠的异步通信方式。通过理解和掌握消息队列的概念及其在C#中的实现,可以极大地优化你的应用程序架构,提升系统的稳定性和可扩展性。

    tp5.1消息队列 think-queue

    总结,"tp5.1消息队列 think-queue" 是一种在ThinkPHP5.1环境中实现消息队列的方式,通过使用think-queue组件,开发者可以轻松地创建和管理异步任务,提高应用的并发处理能力和系统稳定性。理解其安装、配置、使用...

    数据结构实验报告2-栈与队列-队列基本操作算法-实验内容及要求.docx

    - 采用队头/队尾间隔至少一个空闲元素的方法实现循环队列,这样可以避免队列的物理连续性与逻辑连续性的混淆,同时便于检测队列是否为空或满。 - 当队列为满时尝试执行入队操作,或者队列为时空执行出队操作时,...

    数据结构实验栈和队列详细实验报告

    【栈和队列的基本概念】 栈是一种特殊的线性表,具有“后进先出”(LIFO,Last In First Out)的特点。栈的主要操作包括入栈(Push)和出栈(Pop)。入栈操作是在栈顶添加元素,而出栈则是删除栈顶元素。栈的应用...

    串口缓冲区 循环队列

    总结来说,串口缓冲区结合循环队列的设计,为STM32F103ZET6上的串口通信提供了一种高效、可靠的解决方案。通过合理地管理和操作循环队列,可以在保证数据完整性的同时,有效平衡数据的接收和处理速度,提升系统的...

    队列的基本操作

    #### 五、总结 通过以上分析,我们可以了解到链式队列的基本概念、结构及其实现方法。链式队列相比于顺序队列具有更好的动态扩展能力,适用于需要频繁进行入队和出队操作的应用场景。理解链式队列的基本操作有助于...

    入队列出队列练习_Labview队列的使用_labview队列_

    总结来说,“入队列出队列练习”是学习LabVIEW中队列操作的一个良好起点。通过实践,用户可以深入理解队列的工作原理,以及如何在实际项目中有效地使用队列。通过不断地实践和探索,LabVIEW的使用者能够逐步提高其在...

Global site tag (gtag.js) - Google Analytics