当前位置: 首页 > article >正文

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

 一、队列的概念

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

二、代码示例

1.使用数组实现的队列

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.使用链表实现的队列

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);
    }

}

链表部分代码:

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
    }
}


http://www.kler.cn/a/399321.html

相关文章:

  • 智能网页内容截图工具:AI助力内容提取与可视化
  • 蓝牙 HFP 协议详解及 Android 实现
  • reactflow 中 selectionMode 组件作用
  • React中组件通信的几种方式
  • 前端埋点、监控
  • 微服务链路追踪skywalking安装
  • C# 反射与动态编程
  • 本草智链:中药实验管理的区块链应用
  • web前端开发--网页
  • C++(Qt)软件调试---内存泄漏分析工具MTuner (25)
  • 199. 二叉树的右视图【 力扣(LeetCode) 】
  • 深挖C++赋值
  • 在Ubuntu22.04上源码构建ROS noetic环境
  • Harmony错题本--@Preview标注上依然无法预览
  • vim教程
  • 全媒体数字化转型浪潮下半场,有效流量创新业务是转型成功与否的最好证明
  • Brave127编译指南 Windows篇:获取源码(六)
  • 2024.11.16上午Linux上课笔记
  • C++泛型编程-函数模板、类模板
  • 使用Web Animations API实现复杂的网页动画效果
  • k8clone二进制工具迁移k8s中的无状态应用
  • 【汇编】c++游戏开发
  • Kubernetes 集群中防火墙配置的挑战及替代防护策略
  • 计算机网络基础(3)_应用层自定义协议与序列化
  • SQL面试题——抖音SQL面试题 主播播出时长
  • 【数据结构与算法】查找