数据结构------队列(Java语言描述)

一、队列的概念

队列是一种数据结构,它遵循先进先出的原则。就像排队买东西一样,先到的人先得到服务,先进入队列的数据元素先被取出。例如,在一个银行排队系统中,顾客按照到达的先后顺序排队等待办理业务。第一个进入队列(排队)的顾客会第一个被服务并离开队列。

二、代码示例

1.使用数组实现的队列

java 复制代码
package dataStructure.queue;

//使用数组实现的队列
public class ArrayQueue {

    //定义的时候不初始化,因为长度是使用的时候才能知道
    private int[] data;
    private int i;//数组中存入数据的个数


    //参数n是使用者来传递的一个数值,用来表示数组的长度
    public ArrayQueue(int n) {
        data = new int[n];
    }

    //数据入队的方法
    public void add(int e) {
        if (i >= data.length) {
            throw new RuntimeException("队列已满");
        }
        data[i] = e;
        i++;
    }


    //出队的方法
    public int pop() {
        if (i == 0) {
            throw new RuntimeException("队列里没有数据");
        }
        int v = data[0];
        //后面的数据向前移动
        for (int i = 0; i < this.i - 1; i++) {
            data[i] = data[i + 1];
        }
        i--;
        return v;
    }

    public String toString() {
        String str = "";
        for (int i = 0; i < this.i; i++) {
            str = str + data[i];
            if (i < this.i - 1) {
                str = str + ",";
            }
        }
        return str;
    }

    public static void main(String[] args) {
        ArrayQueue aq = new ArrayQueue(5);
        aq.add(1);
        aq.add(2);
        aq.add(3);
        aq.add(4);
        aq.add(5);
        aq.pop();
        aq.add(6);
        System.out.println(aq);

    }
}

2.使用链表实现的队列

java 复制代码
package dataStructure.queue;

import dataStructure.linked.MyLinkedList;

//使用链表实现的队列
public class LinkedQueue {

    private MyLinkedList data = new MyLinkedList();

    public void add(int e){
        data.add(e);
    }

    public int pop(){
        return data.delete(0);
    }

    public static void main(String[] args) {
        LinkedQueue lq = new LinkedQueue();
        lq.add(1);
        lq.add(2);
        lq.add(3);
        lq.add(4);
        lq.pop();
        System.out.println(lq.data);
    }

}

链表部分代码:

java 复制代码
package dataStructure.linked;

//自定义链表类
public class MyLinkedList {

    //最简洁的链表,只有头就可以,但是效率会低
    private LinkedNode head;

    //有尾节点可以在添加新节点时候直接挂到尾结点的后面,提高效率
    private LinkedNode tail;

    //用来记录链表里的数据的数量
    private int size;

    public int getSize() {
        return size;
    }

    //用来往链表中添加数据的方法
    public void add(int e) {
        //创建节点对象,用来存储数据,然后把节点对象放到链表里
        LinkedNode node = new LinkedNode(e);

        //这种情况表示链表是空的
        if (head == null) {
            //如果链表是空的,那么新节点即是头节点,又是尾节点
            head = node;
            tail = node;
        } else {
            //如果链表不为空,则新节点应该添加到尾节点的后面
            tail.next = node;
            tail = node;
        }
        size++;
    }


    //1,2,3,4,5
    //3
    public int get(int i) {
        if (i > size - 1) {
            throw new IndexOutOfBoundsException("下标越界" + i);
        }
        LinkedNode n = head;
        for (int j = 0; j < i; j++) {
            n = n.next;
        }
        return n.data;
    }

    //删除指定位置的数据,并返回被删除数据的值
    public int delete(int i) {
        if (i == 0) {
            LinkedNode n = head;
            head = head.next;
            n.next = null;
            size--;
            return n.data;
        }
        LinkedNode n = head;
        //要找到被删除节点的前面的节点,所以要循环i-1次
        for (int j = 0; j < i - 1; j++) {
            n = n.next;
        }
        //先接收一下被删除的节点对象
        LinkedNode del = n.next;
        n.next = n.next.next;
        del.next = null;
        size--;
        return del.data;
    }


    public String toString() {
        LinkedNode n = head;
        String str = "";
        while (n != null) {
            str = str + n.data;
            if (n.next != null) {
                str = str + "->";
            }
            n = n.next;
        }
        return str;
    }

    public static void main(String[] args) {
        MyLinkedList linked = new MyLinkedList();
        linked.add(1);
        linked.add(2);
        linked.add(3);
        linked.add(4);
        linked.add(5);
        System.out.println(linked);//1->2->3->4->5

        linked.delete(2);
        System.out.println(linked);//1->2->4->5

        System.out.println(linked.get(3));//5
    }
}
相关推荐
-曾牛15 分钟前
Spring AI 快速入门:从环境搭建到核心组件集成
java·人工智能·spring·ai·大模型·spring ai·开发环境搭建
啊松同学16 分钟前
【Mybatis】MyBatisPlus的saveBatch真的是批量插入吗?深度解析与性能优化
java·后端·性能优化·mybatis
Cao12345678932130 分钟前
简易学生成绩管理系统(C语言)
c语言·开发语言
The Future is mine32 分钟前
C# new Bitmap(32043, 32043, PixelFormat.Format32bppArgb)报错:参数无效,如何将图像分块化处理?
开发语言·c#
亿坊电商34 分钟前
PHP框架在微服务迁移中能发挥什么作用?
开发语言·微服务·php
烁34734 分钟前
每日一题(小白)模拟娱乐篇33
java·开发语言·算法
坐吃山猪1 小时前
Python-Agent调用多个Server-FastAPI版本
开发语言·python·fastapi
88号技师1 小时前
【1区SCI】Fusion entropy融合熵,多尺度,复合多尺度、时移多尺度、层次 + 故障识别、诊断-matlab代码
开发语言·机器学习·matlab·时序分析·故障诊断·信息熵·特征提取
软行1 小时前
LeetCode 每日一题 2845. 统计趣味子数组的数目
数据结构·c++·算法·leetcode
永远在Debug的小殿下1 小时前
查找函数【C++】
数据结构·算法