30分钟掌握-算法(用链表实现队列)演示

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


30分钟掌握-算法(用链表实现队列)演示

01 什么是队列?

栈就像日常排队买东西的人的队列,排到前面的人先买,排在后面的人后买(FIFO),即先进先出,后进后出。


02 队列的结构图

在这里插入图片描述


03 实战

废话不多说,放我的练习demo源码,运行走起来(只供参考哈,上面注释写的蛮全的):

package com.yzy.demo.javatest.link;
/**
 * 有头结点链表实现模板
 * @author yangzhenyu
 * */
public class LNode<T> {
    
    
    public T data;
    public LNode<T> next;
}

package com.yzy.demo.javatest.queue;

import com.yzy.demo.javatest.link.LNode;
/**
 * 链表的方式设计队列的实现
 * 先进先出、后进后出
 * */
public class MyQueue<T> {
    
    
    //头部结点
    LNode<T> head = new LNode();
    //当前结点
    LNode<T> cur = new LNode();
    //队尾结点
    LNode<T> end = new LNode<>();
    public MyQueue(){
    
    
        //头部结点初始化
        cur = head;
    }
    /**
     * 判断队列是否为空
     * */
    public boolean empty(){
    
    
        return head.next == null;
    }
    /**
     * 查看队列中的元素数量
     * */
    public int size(){
    
    
        int i = 0;
        LNode<T> tmp = head.next;
        while (tmp != null){
    
    
            tmp  = tmp.next;
            i++;
        }
        return i;
    }
    /**
     * 入队列 链表新增 (引用对象的方式来建立联系)
     * */
    public void push(T t){
    
    
        //栈实现
        LNode<T> tmp = new LNode();
        tmp.data = t;
        //链表 引用设计
        cur.next = tmp;
        cur = tmp;
        end.data = t;
    }
    /**
     * 出队列, 链表删除头部结点+1位置结点
     * 链表删除原理:前驱结点.next = 后继结点
     * */
    public T pop(){
    
    
        LNode<T> tmp = head.next;
        if (tmp!=null){
    
    
            head.next = tmp.next;
            System.out.println("出队列:"+tmp.data);
            return tmp.data;
        }
        System.out.println("队列已经空了");
        return null;
    }

    /**
     * 不出队列,取得队头元素
     * */
    public T top(){
    
    
        if (head.next!= null){
    
    
            return head.next.data;
        }
        System.out.println("队列已经空了");
        return null;
    }

    /**
     * 不出队列,取得队尾元素
     * */
    public T end(){
    
    
        if (end.data!= null){
    
    
            return end.data;
        }
        System.out.println("队列已经空了");
        return null;
    }

    /**
     * 测试
     * */
    public static void main(String[] args) {
    
    
        MyQueue<Integer> myQueue = new MyQueue<>();
        boolean flag = true;
        //入队列
        System.out.println("开始入队列==============>>>>");
        for (int i=0;i<=10;i++){
    
    
            //偶数入队列
            if (i%2==0){
    
    
                System.out.println("入队列:"+i);
                myQueue.push(i);
            }
        }
        //获取队列内总数
        System.out.println("获取队列内总数:"+ myQueue.size());
        //判断队列是否为空
        System.out.println("判断队列是否为空:"+ myQueue.empty());
        //查询队头数据
        System.out.println("查询队头数据:"+myQueue.top());
        //查询队尾数据
        System.out.println("查询队尾数据:"+myQueue.end());
        //出队列
        while (flag){
    
    
            boolean index = myQueue.pop() == null?true:false;
            if (index){
    
    
                flag = false;
            }
        }
        //获取队列内总数
        System.out.println("获取队列内总数:"+ myQueue.size());
        //判断队列是否为空
        System.out.println("判断队列是否为空:"+ myQueue.empty());
    }

}

运行:

在这里插入图片描述

Guess you like

Origin blog.csdn.net/weixin_38316697/article/details/117816948