zoukankan      html  css  js  c++  java
  • 漫画趣解——队列

    写在前面:

    上一篇文章中我们聊到了栈——漫画趣解什么是栈?
    相信很多小伙伴都理解了栈;
    那么这次,同样采用漫画形式,给大家聊一聊什么是队列;

    思维导图:

    什么是队列?

    队列是一种受限的线性表;
    队列只允许在一端进行插入操作,另一端进行删除操作;

    队列的特性?



    在这里插入图片描述

    允许插入的一端叫队尾,允许删除的的一端叫队头
    先进先出,后进后出

    队列的存储结构:


    代码实现:

    文中完整源码获取请关注公众号《程序员的时光》;
    后台回复——数据结构源码,可以获得常见数据结构代码;

    队列的顺序存储:

    方法类:

    //入队
        public void Push_SeqQueue(SeqQueue queue, Object data){
            if(queue==null){
                return;
            }
            if(data==null){
                return;
            }
            //如果队列容量小于或等于数组容量
            if(queue.size==Max_Size){
                return;
            }
            //元素入队
            queue.data[queue.size]=data;
            queue.size++;
        }
    
     //返回队头元素
        public Object Front_SeqQueue(SeqQueue queue){
            if(queue==null){
                return null;
            }
            if(queue.size==0){
                return null;
            }
            //队头元素下标为0
            return queue.data[0];
        }
    
    //出队
        public void Pop_SeqQueue(SeqQueue queue){
            if(queue==null){
                return;
            }
            if(queue.size==0){
                return;
            }
            //出队操作需要移动全部元素
            for (int i = 0; i < queue.size-1; i++) {
                queue.data[i]=queue.data[i+1];
            }
            queue.size--;
        }
    

    主函数:

    public static void main(String[] args) {
            SeqQueueDao seqQueueDao=new SeqQueueDao();
            //初始化队列
            SeqQueue queue=seqQueueDao.Init_SeqQueue();
    
            //入队
            seqQueueDao.Push_SeqQueue(queue,"A");
            seqQueueDao.Push_SeqQueue(queue,"B");
            seqQueueDao.Push_SeqQueue(queue,"C");
            seqQueueDao.Push_SeqQueue(queue,"D");
            seqQueueDao.Push_SeqQueue(queue,"E");
    
            //出队
            while (queue.size>0){
                //查找队头元素
                Object o=seqQueueDao.Front_SeqQueue(queue);
                System.out.println(o);
                //出队
                seqQueueDao.Pop_SeqQueue(queue);
            }
        }
    

    运行结果:

    队列的链式存储:

    方法类:

    //入队列
        public void Push_LinkQueue(LinkQueue queue,Object data){
            if (queue == null){
                return;
            }
            if (data == null){
                return;
            }
            //创建新插入的结点,也就是队列顶指针后面的第一个元素,因为只能在队列顶进行元素插入或删除
            LinkQueueNode newNode=new LinkQueueNode(data,null);
            //进入插入操作
            newNode.next=queue.head.next;
            //队列顶指针的next等于新插入结点
            queue.head.next=newNode;
            //队列容量加1
            queue.size++;
        }
    
     //出队列
        public void Pop_LinkQueue(LinkQueue queue){
            if (queue == null){
                return;
            }
            if (queue.size == 0){
                return;
            }
            //pPrev指头结点,pCurrent指头结点后面的第一个元素,直到pCurrent为空为止
            LinkQueueNode pPrev=queue.head;
            LinkQueueNode pCurrent=pPrev.next;
            while (pCurrent.next!=null){
                pPrev=pCurrent;
                pCurrent=pPrev.next;
            }
            pPrev.next=null;
            //队列容量减1
            queue.size--;
        }
    
    //返回队头元素
        public Object Front_LinkQueue(LinkQueue queue){
            if (queue == null){
                return null;
            }
            if (queue.size == 0){
                return null;
            }
            //队头元素也就是前面插入的元素,采用循环一直找到队头元素
            LinkQueueNode pCurrent=queue.head;
            while (pCurrent.next!=null){
                pCurrent=pCurrent.next;
            }
            return pCurrent.data;
        }
    

    主函数:

    public static void main(String[] args) {
            LinkQueueDao linkQueueDao=new LinkQueueDao();
            //初始化队列
            LinkQueue queue=linkQueueDao.Init_LinkQueue();
    
            //入队列
            linkQueueDao.Push_LinkQueue(queue,"A");
            linkQueueDao.Push_LinkQueue(queue,"B");
            linkQueueDao.Push_LinkQueue(queue,"C");
            linkQueueDao.Push_LinkQueue(queue,"D");
            linkQueueDao.Push_LinkQueue(queue,"E");
    
            //输出队列元素
            while(!linkQueueDao.IsEmpty_LinkQueue(queue)){
                //查找队头元素
                Object o=linkQueueDao.Front_LinkQueue(queue);
                System.out.println(o);
                //出队列
                linkQueueDao.Pop_LinkQueue(queue);
            }
        }
    

    运行结果:
    在这里插入图片描述


    好了,今天就先分享到这里了,下期给大家带来的讲解!
    更多采用漫画趣解编程知识的文章,欢迎关注我的微信公众号,一起学习进步!
    源码获取,后台回复——数据结构源码


                    原创实属不易,求个关注吧~

  • 相关阅读:
    Java对象的生命周期与作用域的讨论(转)
    [置顶] Oracle学习路线与方法
    Java实现 蓝桥杯 算法训练 未名湖边的烦恼
    Java实现 蓝桥杯 算法训练 未名湖边的烦恼
    Java实现 蓝桥杯 算法训练 未名湖边的烦恼
    Java实现 蓝桥杯 算法训练 最大的算式
    Java实现 蓝桥杯 算法训练 最大的算式
    Java实现 蓝桥杯 算法训练 最大的算式
    Java实现 蓝桥杯 算法训练 最大的算式
    Java实现 蓝桥杯 算法训练 最大的算式
  • 原文地址:https://www.cnblogs.com/huke123/p/12409768.html
Copyright © 2011-2022 走看看