zoukankan      html  css  js  c++  java
  • 浅谈Java中的数据结构(队列)

    借助Java语言用数组和链表实现队列

     

    Part 1 用链表实现队列

    QueueNode类是用来表示一个链表节点的类,QueueLinked是链表实现的队列,

    其中front是对首指针,rear是队尾指针,队首出队,队尾入队。

     1 package test;
     2 /**
     3  * 链表节点类
     4  */
     5 class QueueNode {
     6     Object data; // 节点存储的数据
     7     QueueNode next; // 指向下个节点的指针
     8 
     9     public QueueNode() {
    10         this(null, null);
    11     }
    12     public QueueNode(Object data) {
    13         this(data, null);
    14     }
    15     public QueueNode(Object data, QueueNode next) {
    16         this.data = data;
    17         this.next = next;
    18     }
    19 }
    20 /**
    21  * 单向链表实现的队列
    22  */
    23 public class Manager {
    24     QueueNode front; // 队首指针
    25     QueueNode rear;  // 队尾指针
    26 
    27     public Manager() {
    28         this.rear = null;
    29         this.front = null;
    30     }
    31     /**
    32      * 将一个对象追加到队列的尾部
    33      */
    34     public void enqueue(Object obj) {
    35         //如果队列是空的
    36         if (rear == null && front == null) {
    37             rear = new QueueNode(obj);
    38             front = rear;
    39         } else {
    40             QueueNode node = new QueueNode(obj);
    41             rear.next = node;
    42             rear = rear.next;
    43         }
    44     }
    45     /**
    46      * 队首对象出队
    47      * @return 出队的对象,队列空时返回null
    48      */
    49     public Object dequeue() {
    50         //如果队列空
    51         if (front == null) {
    52             return null;
    53         }
    54         //如果队列中只剩下一个节点
    55         if (front == rear && rear != null) {
    56             QueueNode node = front;
    57             rear = null;
    58             front = null;
    59             return node.data;
    60         }
    61         Object obj = front.data;
    62         front = front.next;
    63         return obj;
    64     }
    65 
    66     public static void main(String[] args) {
    67         //遍历输出
    68         Manager q = new Manager();
    69         q.enqueue("。");
    70         q.enqueue("。。");
    71         q.enqueue("。。。");
    72         q.enqueue("。。。。");
    73         for (int i = 0; i < 4; i++) {
    74             System.out.println(q.dequeue());
    75         }
    76     }
    77 }

     Part 2 用数组实现队列

     1 package test;
     2 /**
     3  * 顺序存储结构队列
     4  */
     5 public class Manager {
     6     private static final int MAX_SIZE = 100;
     7     private Object[] queue;        //队列
     8     private int front;                     //头指针
     9     private int rear;                      //尾指针
    10     private int length;                //队列初始化长度  
    11     //初始化队列
    12     private void init(){
    13         queue = new Object[this.length + 1]; 
    14         front = rear = 0;
    15     }
    16     //入队
    17     public void put(Object object) throws Exception{
    18         if(isFull()){
    19             throw new Exception("入队失败!队列已满!");
    20         }
    21         queue[rear] = object;
    22         rear = (rear + 1) % queue.length;
    23     }
    24     //出队
    25     public Object get() throws Exception{
    26         if(isEmpey()){
    27             throw new Exception("出队失败!队列为空!");
    28         }
    29         Object object = queue[front];
    30         queue[front] = null;  //释放对象
    31         front = (front + 1) % queue.length;
    32         return object;
    33     }
    34     //清空队列
    35     public void clear(){
    36         queue = null;
    37         queue = new Object[this.length];
    38     }
    39     //获得队列当前大小
    40     public int size(){
    41         return (rear - front + queue.length ) % queue.length;
    42     }
    43     //判断队列是否已满
    44     public boolean isFull(){
    45         return (rear + 1) % queue.length == front;
    46     }
    47     //判断队列是否为空
    48     public boolean isEmpey(){
    49         return front == rear;
    50     }
    51     public Manager(){
    52         this.length = MAX_SIZE;
    53         init();
    54     }
    55     public Manager(int length){
    56         this.length = length;
    57         init();
    58     }
    59 
    60     public static void main(String[] args) {
    61         Manager queue = new Manager(5);
    62         char[] data = new char[]{'1','2','3','4','5'};
    63         try {
    64             for (int i = 0; i < data.length; i++) {
    65                 System.out.println("入队数据:" + data[i]);
    66                 queue.put(data[i]);
    67             }
    68             System.out.println("队大小:" + queue.size());
    69             System.out.println("---------------------");
    70             while(!queue.isEmpey()){
    71                 System.out.println("出队数据:" + queue.get());
    72             }
    73             System.out.println("队空否?	" + queue.isEmpey());
    74         }catch (Exception e) {
    75             e.printStackTrace();
    76         }
    77     }
    78 }    
  • 相关阅读:
    从底层谈WebGIS 原理设计与实现(六):WebGIS中地图瓦片在Canvas上的拼接显示原理
    从底层谈WebGIS 原理设计与实现(五):WebGIS中通过行列号来换算出多种瓦片的URL 之在线地图
    从底层谈WebGIS 原理设计与实现(四):WebGIS中通过行列号来换算出多种瓦片的URL 之离线地图
    从底层谈WebGIS 原理设计与实现(三):WebGIS前端地图显示之根据地理范围换算出瓦片行列号的原理(核心)
    从底层谈WebGIS 原理设计与实现(二):探究本质,WebGIS前端地图显示之地图比例尺换算原理
    [leetcode]Rotate List
    [leetcode]Remove Element
    [leetcode]Binary Tree Level Order Traversal II
    [leetcode]Populating Next Right Pointers in Each Node II
    [leetcode]Construct Binary Tree from Inorder and Postorder Traversal
  • 原文地址:https://www.cnblogs.com/zzy9669/p/4099122.html
Copyright © 2011-2022 走看看