zoukankan      html  css  js  c++  java
  • 数据结构--队列

    什么是数据结构?
    相互之间存在一种或多种特定关系的数据元素的集合。

    1、什么是队列?
    先进先出(FIFO:first in first out)

    普通队列:队列有两种排发:1、、每处理一条数据,后面的数据都会依次前进一位。(效率较低)。2、、每处理一条数据,就会去下一条数据的空间处理下一位。(占用内存,浪费空间)

    如果使用售票员和排队买票的说法,那么第一种是排队的人动,第二种是售票员动;


    环形队列:有顺时针和逆时针之说,以第二种方法排队。(优点:提高效率的同时,可以充分使用内存,不会占用空间

    创建队列:传入一个队列的容量初始化一个队列
    销毁队列:销毁已存在的指定队列,因为创建队列是使用数组从创建的,所以必须要使用销毁数组的方式进行销毁,否则会造成内存泄漏
    清空队列:将这指定队列中的元素清空,使该队列的长度为0(传入队尾、队首和队列长度三项置为0即可)
    判空队列:判断指定队列是否是空队列(即判断队列长度是否为0,如果等于0则返回true,否则返回false)
    判满队列:判断指定队列的队列长度和队列容量是否相同(相同则返回true,否则返回false)
    队列长度:返回指定队列的元素个数据,统计队列的长度
    新元素入队:自动加入到指定队列的最后一位(如果队列是满的,返回false,如果队列是空的,则加入队列的最后一位,队尾做自增操作并 取余队列容量,指向下一个位置,并使队列的长度加一
    首元素出队:删除该队列的第一个元素(如果当前队列是空的,返回false,如果不为空,则获取当前队列的队头,进行删除,队头做自增操作并 取余队列容量,指向下一个位置,并使队列的长度减一

    注:此处做取余操作,是因为需要考虑队尾值如果超过了容量的情况, 被取余数 < 取余数  结果 等于自己本身,避免数组越界。


    遍历队列:输出该队列的所有元素(使用 for 循环,以队首的下标为起始,以队列的长度+队首的下标(此处是因为队首的数字增加了,那么队首到长度之间的循环次数就会缩减,所以长度需要加上队首的下标)为终结,对 i 进行自增,并对 i 取余容量(此处注意:是对队列的容量进行取余,不要对队列的长度进行取余)同样进行取余操作)
    新元素入队和首元素出队操作,因为是环形队列,所以当环形队列走了一圈之后队或队伍再进行自增就会下标越界,导致程序错误,所以需要取余于队列容量

    下方附上队列数据结构代码:

    package util;
    
    public class MyQueue {
        //队列数组指针
        private Object[] myQueue;
        //队列长度
        private int myQueueLen;
        //队列容量
        private int myQueueCapacity;
        //队列头的指针
        private int myQueueHead;
        //队列尾的指针
        private int myQueueTail;
        
        public MyQueue() {
            super();
        }
    
        /**
         * 初始化队列内存空间
         * @param queueCapacity 队列容量
         * @return 
         */
        public MyQueue(int queueCapacity){
            myQueueCapacity = queueCapacity;
    
            // 申请内存空间
            myQueue = new Object[myQueueCapacity];
            clearQueue();
        }
        
        /**
         * 将数组赋值为null,垃圾回收器会自动回收
         */
        public void deleteQueue(){
            myQueue = null;
        }
        
        /**
         * 清空队列
         */
        public void clearQueue(){
            myQueueHead = 0;
            myQueueTail = 0;
            myQueueLen = 0;
        }
        
        /**
         * 使用三目运算符,判断队列的长度是否等于0
         * @return boolean 相等返回true,不相等返回false
         */
        public boolean isNullQueue(){
            return 0 == myQueueLen ? true : false;
        }
        
        /**
         * 使用三目运算符,判断队列的长度是否等于队列的容量
         * @return boolean 相等返回true,不相等返回false
         */
        public boolean isFullQueue(){
            return myQueueLen == myQueueCapacity ? true : false;
        }
        
        /**
         * 直接根据数组的length方法返回队列的长度
         * @return
         */
        public int queueLen(){
            return myQueueLen;
        }
        
        /**
         * 判断队列是否已经满队,添加元素到队列中,并更新队头和长度的下标
         * @param element
         * @return
         */
        public boolean addElement(Object element){
            if(isFullQueue())
            {
                return false;
            } 
            else
            {
                myQueue[myQueueTail] = element;
                ++ myQueueTail;
                myQueueTail = myQueueTail % myQueueCapacity;
                myQueueLen ++;
                return true;
            }
        }
        
        /**
         * 判断队列是否是空队,删除队列中的第一个元素,并更新队头和长度的下标
         * @return
         * @throws Exception 
         */
        public Object delElement() throws Exception{
            if (isNullQueue()){
                throw new Exception("队列为空,不能删除元素");
            } 
            else 
            {
                Object element = myQueue[myQueueHead];
                myQueueHead = ++ myQueueHead % myQueueCapacity;
                myQueueLen --;
                return element;
            }
        }
        
        public void queueTraverse(){
            for (int i = myQueueHead; i < myQueueLen + myQueueHead; i++)
            {
                Object element = myQueue[i % myQueueCapacity];
                
                System.out.println(element.toString()+"");
            }
        }
    }
    

      测试数据结构效果:

    package use.test;
    
    import test.entity.Person;
    import util.*;
    
    public class TestMyQueue {
        public static void main(String[] args) {
            MyQueue myQueue = new MyQueue(4);
            
            Person person1 = new Person();
            person1.setAddress("合肥市蜀山区");
            person1.setName("张三");
            person1.setAge(22);
            
            Person person2 = new Person();
            person2.setAddress("南京市江宁区");
            person2.setName("李四");
            person2.setAge(44);
            
            Person person3 = new Person();
            person3.setAddress("合肥市庐阳区");
            person3.setName("王五");
            person3.setAge(35);
            
            //添加队列
            myQueue.addElement(person1);
            myQueue.addElement(person2);
            myQueue.addElement("wangwu");
            myQueue.addElement(person3);
            
            System.out.println("队列的长度:"+myQueue.queueLen());
            myQueue.queueTraverse();
            
            //删除队列
            try {
                //删除时,如果队列为空,则会跑出Exception异常
                Object element1 = myQueue.delElement();
                System.out.println("当前删除的元素为" + element1.toString());
                Object element2 = myQueue.delElement();
                System.out.println("当前删除的元素为" + element2.toString());
            } catch (Exception e) {
                e.printStackTrace();
            }
            
            
            System.out.println("队列的长度:"+myQueue.queueLen());
            myQueue.queueTraverse();
            
            //添加队列
            myQueue.addElement(5);
            myQueue.addElement(6);
            myQueue.addElement(7);
            
            System.out.println("队列的长度:" + myQueue.queueLen());
            myQueue.queueTraverse();
            
            //清空队列
    //        myQueue.clearQueue();
            if (myQueue.isNullQueue())
            {
                System.out.println("队列为空");
            }
            
            if (myQueue.isFullQueue())
            {
                System.out.println("队列为满");
            }
            System.out.println("队列的长度:" + myQueue.queueLen());
            
        }
    }
    

      

  • 相关阅读:
    好用的javascript eclipse插件Aptana
    汉字字符串转换成十六进制byte数组,一个汉字存到两个byte里面,大整数存到两个byte里面
    三星 平板手机电脑 Galaxytab2忘记开机密码解决方法
    java float 加减精度问题
    android 增加Addon属性支持的方法
    基于jquery的kendoUI 可以实现快速开发,节省大量web UI开发工作量
    zdz工具箱v1.5 android版本发布了,集成各种个人生活中常用的工具,方便日常使用管理
    存储联系人信息(进程com.motorola.contacts)意外停止 事件提醒eventreminder异常 处理方法
    playframework 同时运行多个项目的方法修改默认端口号
    免费的Git私有代码托管服务
  • 原文地址:https://www.cnblogs.com/fuhui-study-footprint/p/9087543.html
Copyright © 2011-2022 走看看