数据结构------队列(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
    }
}
相关推荐
monkey_meng2 分钟前
【Rust类型驱动开发 Type Driven Development】
开发语言·后端·rust
手握风云-4 分钟前
零基础Java第十六期:抽象类接口(二)
数据结构·算法
落落落sss10 分钟前
MQ集群
java·服务器·开发语言·后端·elasticsearch·adb·ruby
我救我自己10 分钟前
UE5运行时创建slate窗口
java·服务器·ue5
2401_8532757331 分钟前
ArrayList 源码分析
java·开发语言
zyx没烦恼31 分钟前
【STL】set,multiset,map,multimap的介绍以及使用
开发语言·c++
lb363636363631 分钟前
整数储存形式(c基础)
c语言·开发语言
feifeikon33 分钟前
Python Day5 进阶语法(列表表达式/三元/断言/with-as/异常捕获/字符串方法/lambda函数
开发语言·python
爪哇学长35 分钟前
SQL 注入详解:原理、危害与防范措施
xml·java·数据库·sql·oracle
大鲤余40 分钟前
Rust,删除cargo安装的可执行文件
开发语言·后端·rust