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);
            }
        }
    

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


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


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

  • 相关阅读:
    Web前端工程师技能列表
    CSS框架的相关汇总(CSS Frameworks)
    一个有趣的发现
    (转丁学)Firefox2的一个bug和脑子进了水的IE
    深入语义:列表Tag(ul/ol)和表格Tag(table)的抉择
    css命名简单框架
    腾讯的三栏布局考题
    土豆网前端概况
    伪绝对定位(译)
    右下角浮动广告代码DEMO
  • 原文地址:https://www.cnblogs.com/huke123/p/12409768.html
Copyright © 2011-2022 走看看