java 实现数据结构之队列

队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,只允许在表的后端(rear)进行插入操作。
1.队列的顺序存储结构及实现
Java代码   收藏代码
  1. public class SequenceQueue<T>  
  2. {  
  3.     private int DEFAULT_SIZE = 10;  
  4.     //保存数组的长度。  
  5.     private int capacity;  
  6.     //定义一个数组用于保存顺序队列的元素  
  7.     private Object[] elementData;  
  8.     //保存顺序队列中元素的当前个数  
  9.     private int front = 0;  
  10.     private int rear = 0;  
  11.     //以默认数组长度创建空顺序队列  
  12.     public SequenceQueue()  
  13.     {  
  14.         capacity = DEFAULT_SIZE;  
  15.         elementData = new Object[capacity];  
  16.     }  
  17.     //以一个初始化元素来创建顺序队列  
  18.     public SequenceQueue(T element)  
  19.     {  
  20.         this();  
  21.         elementData[0] = element;  
  22.         rear++;  
  23.     }  
  24.     /** 
  25.      * 以指定长度的数组来创建顺序队列 
  26.      * @param element 指定顺序队列中第一个元素 
  27.      * @param initSize 指定顺序队列底层数组的长度 
  28.      */  
  29.     public SequenceQueue(T element , int initSize)  
  30.     {  
  31.         this.capacity = initSize;  
  32.         elementData = new Object[capacity];  
  33.         elementData[0] = element;  
  34.         rear++;  
  35.     }  
  36.     //获取顺序队列的大小  
  37.     public int length()  
  38.     {  
  39.         return rear - front;  
  40.     }  
  41.     //插入队列  
  42.     public void add(T element)  
  43.     {  
  44.         if (rear > capacity - 1)  
  45.         {  
  46.             throw new IndexOutOfBoundsException("队列已满的异常");  
  47.         }  
  48.         elementData[rear++] = element;  
  49.     }  
  50.     //移除队列  
  51.     public T remove()  
  52.     {  
  53.         if (empty())  
  54.         {  
  55.             throw new IndexOutOfBoundsException("空队列异常");  
  56.         }  
  57.         //保留队列的rear端的元素的值  
  58.         T oldValue = (T)elementData[front];  
  59.         //释放队列的rear端的元素  
  60.         elementData[front++] = null;   
  61.         return oldValue;  
  62.     }  
  63.     //返回队列顶元素,但不删除队列顶元素  
  64.     public T element()  
  65.     {  
  66.         if (empty())  
  67.         {  
  68.             throw new IndexOutOfBoundsException("空队列异常");  
  69.         }  
  70.         return (T)elementData[front];  
  71.     }  
  72.     //判断顺序队列是否为空队列  
  73.     public boolean empty()  
  74.     {  
  75.         return rear == front;  
  76.     }  
  77.     //清空顺序队列  
  78.     public void clear()  
  79.     {  
  80.         //将底层数组所有元素赋为null  
  81.         Arrays.fill(elementData , null);  
  82.         front = 0;  
  83.         rear = 0;  
  84.     }  
  85.     public String toString()  
  86.     {  
  87.         if (empty())  
  88.         {  
  89.             return "[]";  
  90.         }  
  91.         else  
  92.         {  
  93.             StringBuilder sb = new StringBuilder("[");  
  94.             for (int i = front  ; i < rear ; i++ )  
  95.             {  
  96.                 sb.append(elementData[i].toString() + ", ");  
  97.             }  
  98.             int len = sb.length();  
  99.             return sb.delete(len - 2 , len).append("]").toString();  
  100.         }  
  101.     }  
  102. }  

2.循环队列(顺序结构存储实现)

Java代码   收藏代码
  1. import java.util.Arrays;  
  2. public class LoopQueue<T>  
  3. {  
  4.     private int DEFAULT_SIZE = 10;  
  5.     //保存数组的长度。  
  6.     private int capacity;  
  7.     //定义一个数组用于保存循环队列的元素  
  8.     private Object[] elementData;  
  9.     //保存循环队列中元素的当前个数  
  10.     private int front = 0;  
  11.     private int rear = 0;  
  12.     //以默认数组长度创建空循环队列  
  13.     public LoopQueue()  
  14.     {  
  15.         capacity = DEFAULT_SIZE;  
  16.         elementData = new Object[capacity];  
  17.     }  
  18.     //以一个初始化元素来创建循环队列  
  19.     public LoopQueue(T element)  
  20.     {  
  21.         this();  
  22.         elementData[0] = element;  
  23.         rear++;  
  24.     }  
  25.     /** 
  26.      * 以指定长度的数组来创建循环队列 
  27.      * @param element 指定循环队列中第一个元素 
  28.      * @param initSize 指定循环队列底层数组的长度 
  29.      */  
  30.     public LoopQueue(T element , int initSize)  
  31.     {  
  32.         this.capacity = initSize;  
  33.         elementData = new Object[capacity];  
  34.         elementData[0] = element;  
  35.         rear++;  
  36.     }  
  37.     //获取循环队列的大小  
  38.     public int length()  
  39.     {  
  40.         if (empty())  
  41.         {  
  42.             return 0;  
  43.         }  
  44.         return rear > front ? rear - front   
  45.             : capacity - (front - rear);  
  46.     }  
  47.     //插入队列  
  48.     public void add(T element)  
  49.     {  
  50.         if (rear == front   
  51.             && elementData[front] != null)  
  52.         {  
  53.             throw new IndexOutOfBoundsException("队列已满的异常");  
  54.         }  
  55.         elementData[rear++] = element;  
  56.         //如果rear已经到头,那就转头  
  57.         rear = rear == capacity ? 0 : rear;  
  58.     }  
  59.     //移除队列  
  60.     public T remove()  
  61.     {  
  62.         if (empty())  
  63.         {  
  64.             throw new IndexOutOfBoundsException("空队列异常");  
  65.         }  
  66.         //保留队列的rear端的元素的值  
  67.         T oldValue = (T)elementData[front];  
  68.         //释放队列的rear端的元素  
  69.         elementData[front++] = null;   
  70.         //如果front已经到头,那就转头  
  71.         front = front == capacity ? 0 : front;  
  72.         return oldValue;  
  73.     }  
  74.     //返回队列顶元素,但不删除队列顶元素  
  75.     public T element()  
  76.     {  
  77.         if (empty())  
  78.         {  
  79.             throw new IndexOutOfBoundsException("空队列异常");  
  80.         }  
  81.         return (T)elementData[front];  
  82.     }  
  83.     //判断循环队列是否为空队列  
  84.     public boolean empty()  
  85.     {  
  86.         //rear==front且rear处的元素为null  
  87.         return rear == front   
  88.             && elementData[rear] == null;  
  89.     }  
  90.     //清空循环队列  
  91.     public void clear()  
  92.     {  
  93.         //将底层数组所有元素赋为null  
  94.         Arrays.fill(elementData , null);  
  95.         front = 0;  
  96.         rear = 0;  
  97.     }  
  98.     public String toString()  
  99.     {  
  100.         if (empty())  
  101.         {  
  102.             return "[]";  
  103.         }  
  104.         else  
  105.         {  
  106.             //如果front < rear,有效元素就是front到rear之间的元素  
  107.             if (front < rear)  
  108.             {  
  109.                 StringBuilder sb = new StringBuilder("[");  
  110.                 for (int i = front  ; i < rear ; i++ )  
  111.                 {  
  112.                     sb.append(elementData[i].toString() + ", ");  
  113.                 }  
  114.                 int len = sb.length();  
  115.                 return sb.delete(len - 2 , len).append("]").toString();  
  116.             }  
  117.             //如果front >= rear,有效元素为front->capacity之间、0->front之间的  
  118.             else  
  119.             {  
  120.                 StringBuilder sb = new StringBuilder("[");  
  121.                 for (int i = front  ; i < capacity ; i++ )  
  122.                 {  
  123.                     sb.append(elementData[i].toString() + ", ");  
  124.                 }  
  125.                 for (int i = 0 ; i < rear ; i++)  
  126.                 {  
  127.                     sb.append(elementData[i].toString() + ", ");  
  128.                 }  
  129.                 int len = sb.length();  
  130.                 return sb.delete(len - 2 , len).append("]").toString();  
  131.             }  
  132.         }  
  133.     }  
  134. }  

3.队列的链式存储结构及实现
Java代码   收藏代码
  1. public class LinkQueue<T>  
  2. {  
  3.     //定义一个内部类Node,Node实例代表链队列的节点。  
  4.     private class Node  
  5.     {  
  6.         //保存节点的数据  
  7.         private T data;  
  8.         //指向下个节点的引用  
  9.         private Node next;  
  10.         //无参数的构造器  
  11.         public Node()  
  12.         {  
  13.         }  
  14.         //初始化全部属性的构造器  
  15.         public Node(T data ,  Node next)  
  16.         {  
  17.             this.data = data;  
  18.             this.next = next;  
  19.         }  
  20.     }  
  21.     //保存该链队列的头节点  
  22.     private Node front;  
  23.     //保存该链队列的尾节点  
  24.     private Node rear;  
  25.     //保存该链队列中已包含的节点数  
  26.     private int size;  
  27.     //创建空链队列  
  28.     public LinkQueue()  
  29.     {  
  30.         //空链队列,front和rear都是null  
  31.         front = null;  
  32.         rear = null;  
  33.     }  
  34.     //以指定数据元素来创建链队列,该链队列只有一个元素  
  35.     public LinkQueue(T element)  
  36.     {  
  37.         front = new Node(element , null);  
  38.         //只有一个节点,front、rear都指向该节点  
  39.         rear = front;  
  40.         size++;  
  41.     }  
  42.     //返回链队列的长度    
  43.     public int length()  
  44.     {  
  45.         return size;  
  46.     }  
  47.     //将新元素加入队列  
  48.     public void add(T element)  
  49.     {  
  50.         //如果该链队列还是空链队列  
  51.         if (front == null)  
  52.         {  
  53.             front = new Node(element , null);  
  54.             //只有一个节点,front、rear都指向该节点  
  55.             rear = front;  
  56.         }  
  57.         else  
  58.         {  
  59.             //创建新节点  
  60.             Node newNode = new Node(element , null);  
  61.             //让尾节点的next指向新增的节点  
  62.             rear.next = newNode;  
  63.             //以新节点作为新的尾节点  
  64.             rear = newNode;  
  65.         }  
  66.         size++;  
  67.     }  
  68.     //删除队列front端的元素  
  69.     public T remove()  
  70.     {  
  71.         Node oldFront = front;  
  72.         front = front.next;  
  73.         oldFront.next = null;  
  74.         size--;  
  75.         return oldFront.data;  
  76.     }  
  77.     //访问链式队列中最后一个元素  
  78.     public T element()  
  79.     {  
  80.         return rear.data;  
  81.     }  
  82.     //判断链式队列是否为空队列  
  83.     public boolean empty()  
  84.     {  
  85.         return size == 0;  
  86.     }  
  87.     //清空链队列  
  88.     public void clear()  
  89.     {  
  90.         //将front、rear两个节点赋为null  
  91.         front = null;  
  92.         rear = null;  
  93.         size = 0;  
  94.     }  
  95.     public String toString()  
  96.     {  
  97.         //链队列为空链队列时  
  98.         if (empty())  
  99.         {  
  100.             return "[]";  
  101.         }  
  102.         else  
  103.         {  
  104.             StringBuilder sb = new StringBuilder("[");  
  105.             for (Node current = front ; current != null  
  106.                 ; current = current.next )  
  107.             {  
  108.                 sb.append(current.data.toString() + ", ");  
  109.             }  
  110.             int len = sb.length();  
  111.             return sb.delete(len - 2 , len).append("]").toString();  
  112.         }  
  113.     }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值