zoukankan      html  css  js  c++  java
  • 数组实现队列

    咱不啰嗦队列的特性先进先出,直接上代码。

    package com.dfsn.cloud.eureka;
    
    
    public class Queue<T> {
        private Object[] arr;
        private int size;
        private int pushIndex;
        private int getIndex;
    
        Queue(int initSize) {
            if (initSize < 0) {
                throw new IllegalArgumentException("队列长度不能小于0");
            }
            arr = new Object[initSize];
        }
    
        public void add(T obj) {
            if (size == arr.length) {
                throw new ArrayIndexOutOfBoundsException("队列已经满了");
            }
            arr[pushIndex++] = obj;
            pushIndex = pushIndex == arr.length ? 0 : pushIndex;
            size++;
        }
    
        public T get() {
            if (size == 0) {
                throw new ArrayIndexOutOfBoundsException("队列中没有数据");
            }
            int temp = getIndex;
            getIndex++;
            getIndex = getIndex == arr.length ? 0 : getIndex;
            size--;
            return (T) arr[temp];
        }
    
    }
    View Code

    实现思路:

    1 有一个存放数据的数组,该数组的长度在Queue对象初始化时需要设置容量。

    2 往队列添加元素,size变量默认是0。如果size等于数组的长度。表示当前队列已经满了,如果没有满则向队列添加元素,添加元素后将size自增1。pushIndex标记下一个可用队列的位置,默认是0。如果Queue的大小是3则pushIndex的值是0,1,2。在每次添加元素后,将pushIndex自增1,自增后的标记位如果等于数组的长度,则重置位置为0。意思就是当0,1,2添加完毕后,下一个元素要想添加只能添加到0位置,但是这会不会覆盖原有的元素?不会,因为有size变量限制。添加3个元素后就不能在添加了。

    3 元素出队列,首先判断size如果是0则表示没有元素,不能出,如果不等于0则表示有元素可以出,size自减1。getIndex标记下一个出队列的位置,默认是0。每出一个元素自增1,然后判断出队列位置是否等于队列长度,如果大于则重置位置为0,也就限定了,出队列的顺序是0,1,2。那会不会出现下标越界呢?不会,因为有size判断,如果size是0就表示没有元素。

    以下代码测试:

        public static void main(String[] args) {
            Queue<Integer> queue = new Queue<>(3);
    
            Thread t1 = new Thread(() -> {
                int i = 0;
                while (true) {
                    try {
                        Thread.sleep(500);
                        queue.add(i++);
                    } catch (Exception e) {
                        i--;
                    }
                }
            });
            t1.start();
    
            Thread t2 = new Thread(() -> {
                while (true) {
                    try {
                        Thread.sleep(700);
                        System.out.println(queue.get());
                    } catch (Exception e) {
                    }
                }
            });
            t2.start();
        }
    View Code
  • 相关阅读:
    网页中的图片查看器viewjs使用
    检测和删除多余无用的css
    网页中插入视频的方案
    WebSocket使用教程
    JS+CSS简单实现DIV遮罩层显示隐藏【转藏】
    使用GPS经纬度定位附近地点(某一点范围内查询)
    使用SQL Server Management Studio 创建数据库备份作业
    SVN trunk(主线) branch(分支) tag(标记) 用法详解和详细操作步骤
    关于LINQ方方面面的入门、进阶、深入的文章。
    LINQ体验(7)——LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains
  • 原文地址:https://www.cnblogs.com/zumengjie/p/13771459.html
Copyright © 2011-2022 走看看