zoukankan      html  css  js  c++  java
  • 队列的一种实现:循环队列

    队列的一种实现,循环队列,通过使用固定长度数组及首尾指针实现队列的入队、出队等:

    class CircularQueue<T> {
        
        private Object[] data; //数据存储数组
        private int head; //队列头指针
        private int tail; //队列尾指针
        private int size; //队列长度
    
        /**
         * 初始化
         *
         * @param k
         */
        public CircularQueue(int k) {
            data = new Object[k]; //数组初始化
            head = -1;
            tail = -1;
            size = k;
        }
    
        /**
         * 元素入队,成功则返回true,否则false
         *
         * @param value
         * @return
         */
        public boolean put(T value) {
            if (isFull() == true) { //入队,判断队满
                return false;
            }
            if (isEmpty() == true) { //入队,队空,则head置0
                head = 0;
            }
            tail = (tail + 1) % size; //循环队列,队尾循环移动,所以使用取余的方式移动队尾
            data[tail] = value; //将入队元素放入队列
            return true;
        }
    
        /**
         * 出队
         *
         * @return
         */
        public T remove() {
            T result = null;
            if (isEmpty() == true) { //出队、判断队空
                return result;
            }
            if (head == tail) { //队首 队尾重合,则当前队列只剩唯一元素
                result = (T) data[tail];
                head = -1;
                tail = -1;
                return result;
            }
            result = (T) data[head];
            data[head] = null;
            head = (head + 1) % size;
            return result;
        }
    
        /**
         * 获取队首元素
         *
         * @return
         */
        public T head() {
            if (isEmpty() == true) {
                return null;
            }
            return (T) data[head];
        }
    
        /**
         * 获取队尾元素
         *
         * @return
         */
        public T tail() {
            if (isEmpty() == true) {
                return null;
            }
            return (T) data[tail];
        }
    
        /** 对空判断
         *
         * @return
         */
        public boolean isEmpty() {
            return head == -1;
        }
    
        /** 对满判断
         *
         * @return
         */
        public boolean isFull() {
            return ((tail + 1) % size) == head; //尾指针再移动一位则与头指针重合
        }
    
        public String toString(){
            StringBuilder str = new StringBuilder();
            for (Object datum : data) {
                if (datum != null) {
                    str.append(datum);
                }
            }
            return str.toString();
        }
    
        public static void main(String[] args) {
            CircularQueue queue = new CircularQueue<Integer>(5);
            queue.put(5);
            queue.put(3);
            queue.put(1);
            System.out.println(queue);
            System.out.println(queue.head());
            System.out.println(queue.tail());
            queue.remove();
            System.out.println(queue);
            System.out.println(queue.head());
            System.out.println(queue.tail());
        }
    }
  • 相关阅读:
    Asp.NetCore3.1 WebApi 获取配置json文件中的数据
    Dapper同时操作任意多张表的实现
    将视图批量新增到PowerDesigner中并以model图表的形式展示
    .NetCore3.1获取文件并重新命名以及大批量更新及写入数据
    .NetCore 简单的使用中间件
    比较复杂的SQL转Linq
    Asp.NetCore3.1版本的CodeFirst与经典的三层架构与AutoFac批量注入
    Git与GitLab的分支合并等简单的测试操作
    Winform的控件以及DataGridView的一般使用
    在Linux系统中运行并简单的测试RabbitMq容器
  • 原文地址:https://www.cnblogs.com/niejunlei/p/13021278.html
Copyright © 2011-2022 走看看