聊一聊队列

写在前面:

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

思维导图:

什么是队列?

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

队列的特性?



在这里插入图片描述

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

队列的存储结构:


代码实现:

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

队列的顺序存储:

方法类:

//入队
    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);
        }
    }

运行结果:
在这里插入图片描述
好了,今天就先分享到这里了,下期给大家带来的讲解!

                        **原创实属不易,求个关注吧~**
发布了295 篇原创文章 · 获赞 100 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_37084904/article/details/104637687