数据结构------队列(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
    }
}
相关推荐
csxin5 分钟前
Spring Boot 中如何设置 serializer 的 TimeZone
java·后端
@半良人14 分钟前
Deepseek+python自动生成禅道测试用例
开发语言·python·测试用例
一只鲲22 分钟前
48 C++ STL模板库17-容器9-关联容器-映射(map)多重映射(multimap)
开发语言·c++
杨过过儿22 分钟前
【Task02】:四步构建简单rag(第一章3节)
android·java·数据库
青云交23 分钟前
Java 大视界 -- Java 大数据分布式计算在基因测序数据分析与精准医疗中的应用(400)
java·hadoop·spark·分布式计算·基因测序·java 大数据·精准医疗
荔枝爱编程26 分钟前
如何在 Docker 容器中使用 Arthas 监控 Java 应用
java·后端·docker
喵手33 分钟前
Java中Stream与集合框架的差异:如何通过Stream提升效率!
java·后端·java ee
JavaArchJourney34 分钟前
PriorityQueue 源码分析
java·源码
喵手44 分钟前
你知道,如何使用Java的多线程机制优化高并发应用吗?
java·后端·java ee
渣哥1 小时前
10年Java老司机告诉你:为什么永远不要相信浮点数相等
java