• Java实现队列结构(数据结构)


    先给出一些应用队列的场景

      1):当作业被送到打印机的时候,就可以按到达的顺序排起来,因此每一份作业是队列的节点。

      2):售票口的人买票的顺序的按照先来先买的顺序售票。

      3):当所有的终端被占用,由于资源有限,来访请求需要放在一个队列中等候。

    队列是先进先出的!

      我们设置一个叫做LinkQueue<T>的泛型集合类,该类里面有 Node 作为内部类(作为节点用),它包含了泛型元素和下一个node节点的指向next(Node)。

    在Linkqueue的里面设置队列头指针 front和队列尾指针rear,长度size=0;我们先设置一个构造器LinkQueue(),用来初始化这两个指针节点,当然,刚开始初始化的

    时候 这两个指针仅仅是一个节点而已,里面的data是空的,我们还让这两个指针相等。

     1  //链的数据结构  
     2     private class Node{  
     3         public  T data;  
     4         public  Node next;  
     5         //无参构造函数  
     6         public Node(){}  
     7           
     8         public Node(T data,Node next){  
     9             this.data=data;  
    10             this.next=next;  
    11         }  
    12     }  
    13     //队列头指针  
    14     private Node front;  
    15     //队列尾指针  
    16     private Node rear;

      

    1 public LinkQueue(){  
    2         Node n=new Node(null,null);  
    3         n.next=null;  
    4         front=rear=n;  
    5     }  

      当我们向该队列添加元素的时候,就会生成一个新的节点,其data就是你要加的元素,(当添加一个节点时,该节点就是队尾指针指向的最后的节点,一直排在最后),所以

    队尾rear.next=newNode(“新创建的节点”).这是第一个节点,也是最后一个节点,所以front.next=newNode.然后我们再让rear=newNode(不断更新)。

      

    1  public void enqueue(T data){  
    2         //创建一个节点  
    3         Node s=new Node(data,null);  
    4         //将队尾指针指向新加入的节点,将s节点插入队尾  
    5         rear.next=s;  
    6         rear=s;  
    7         size++;  
    8     }  

      当队列出队的时候,还记得我们有一个Node是front.next=newNode 吗?这就是第一个节点。先暂且把它叫做p,所以p.next=第二个节点,这时我们再把front.next=p.next;这样头指针就指向了第二个元素(每一次调用的时候队列头指针指会发生变化)。

     1 public  T dequeue(){  
     2         if(rear==front){  
     3             try {  
     4                 throw new Exception("堆栈为空");  
     5             } catch (Exception e) {  
     6                 e.printStackTrace();  
     7             }  
     8             return null;  
     9         }else{  
    10             //暂存队头元素  
    11             Node p=front.next;  
    12             T x=p.data;  
    13             //将队头元素所在节点摘链  
    14             front.next=p.next;  
    15             //判断出队列长度是否为1  
    16             if(p.next==null)  
    17                 rear=front;  
    18             //删除节点  
    19             p=null;  
    20             size--;  
    21             return  x;  
    22         }  
    23     }  

    到此为止,队列的核心操作就完毕了,剩下的比如说size(长度),isEmpty(是否为空),就不在说了。(因为太简单了!)

    具体源码如下:

     1 public class LinkQueue<T> {  
     2       
     3     //链的数据结构  
     4     private class Node{  
     5         public  T data;  
     6         public  Node next;  
     7         //无参构造函数  
     8         public Node(){}  
     9           
    10         public Node(T data,Node next){  
    11             this.data=data;  
    12             this.next=next;  
    13         }  
    14     }  
    15     //队列头指针  
    16     private Node front;  
    17     //队列尾指针  
    18     private Node rear;  
    19     //队列长度  
    20     private int size=0;  
    21       
    22     public LinkQueue(){  
    23         Node n=new Node(null,null);  
    24         n.next=null;  
    25         front=rear=n;  
    26     }  
    27       
    28     /** 
    29      * 队列入队算法 
    30      * @param data 
    31      * @author WWX 
    32      */  
    33     public void enqueue(T data){  
    34         //创建一个节点  
    35         Node s=new Node(data,null);  
    36         //将队尾指针指向新加入的节点,将s节点插入队尾  
    37         rear.next=s;  
    38         rear=s;  
    39         size++;  
    40     }  
    41       
    42     /** 
    43      * 队列出队算法 
    44      * @return 
    45      * @author WWX 
    46      */  
    47     public  T dequeue(){  
    48         if(rear==front){  
    49             try {  
    50                 throw new Exception("堆栈为空");  
    51             } catch (Exception e) {  
    52                 e.printStackTrace();  
    53             }  
    54             return null;  
    55         }else{  
    56             //暂存队头元素  
    57             Node p=front.next;  
    58             T x=p.data;  
    59             //将队头元素所在节点摘链  
    60             front.next=p.next;  
    61             //判断出队列长度是否为1  
    62             if(p.next==null)  
    63                 rear=front;  
    64             //删除节点  
    65             p=null;  
    66             size--;  
    67             return  x;  
    68         }  
    69     }  
    70       
    71     /** 
    72      * 队列长队 
    73      * @return 
    74      * @author WWX 
    75      */  
    76     public int size(){  
    77         return size;  
    78     }  
    79       
    80     /** 
    81      * 判断队列是否为空 
    82      * @return 
    83      * @author WWX 
    84      */  
    85     public  boolean isEmpty(){  
    86         return  size==0;  
    87           
    88     }  
    89       
    90       }
    View Code

     另:我曾经看过一本JavaScript数据结构书,里面讲的浅显易懂,很适合前端搞js开发的让人理解的更为深入,在此给予推荐。<<数据结构与算法JavaScript描述>>

     

    >>

  • 相关阅读:
    POJ 2533 Longest Ordered Subsequence(裸LIS)
    HDU 1159 Common Subsequence(裸LCS)
    HDU 1160(两个值的LIS,需dfs输出路径)
    HDU 1260 Tickets (普通dp)
    HDU 2859 Phalanx(对称矩阵 经典dp样例)
    2018年暑假ACM个人训练题7 题解报告
    HDU 1060 Leftmost Digit(求N^N的第一位数字 log10的巧妙使用)
    HDU 1071 The area(求三个点确定的抛物线的面积,其中一个点是顶点)
    HDU 1077 Catching Fish(用单位圆尽可能围住多的点)
    HDU 1099 Lottery (求数学期望)
  • 原文地址:https://www.cnblogs.com/coversky/p/6350086.html
Copyright © 2020-2023  润新知