数据结构 01 - 稀疏数组的实现 && 数组模拟循环队列

Circular Queue--循环队列 队列大家见得很多了,形式也比较简单,就是一个特化的链表,它的enqueue、dequeue操作相当于链表的addLast、removeFirst操作。关于链表的实现,可以查看我的另一篇博文--"LinkedList--链表"。下面仅讨论一个稍微复杂点的情况--循环队列。        循环队列的就是用循环数组来实现队列,有一个问题需要解决:在普通的非循环队列中,rear == front 说明队 阅读详情

一、稀疏数组的实现

一般的二维数组中,如果存在太多重复值0,就是说整个数组存放了很多无意义的数组,这会消耗不必要的内存空间。

1.二维数组转稀疏数组的思路**

(1)遍历原始的二维数组,得到有意义数据的个数sum
(2).根据sum就可以创建稀疏数组sparseArr[sum+1][3]
(3).将二维数组的有意义数据存入稀疏数组中

2.稀疏数组转原始数组的思路**

(1).先读取稀疏数组的第一行,从第一行获取原始数组的行列数,比如上面数组就是11*11
(2).再读取稀疏数组后几行的数据,并赋给原始二维数组即可

代码实现:

public class SparseArray {
    public static void main(String[] args) {
        //定义11*11原始数组
        int[][] originalArray = new int[11][11];
        originalArray[1][2] = 1;
        originalArray[2][3] = 2;
        System.out.println("原始二维数组:");
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                System.out.print(originalArray[i][j]+"\t");
            }
            System.out.println();
        }
        System.out.println();
        //1.先遍历二位数组,得到非零数据个数
        int sum = 0;
        for (int i = 0; i < originalArray.length; i++) {
            for (int j = 0; j < originalArray.length; j++) {
                if(originalArray[i][j] != 0){
                    sum++;
                }
            }
        }
        //2.创建对应的稀疏数组
        int[][] sparseArray = new int[sum+1][3];
        sparseArray[0][0] = 11;
        sparseArray[0][1] = 11;
        sparseArray[0][2] = sum;
        //3.再次遍历原始数组,给稀疏数组赋值
        int count = 0;
        for (int i = 0; i < originalArray.length; i++) {
            for (int j = 0; j < originalArray.length; j++) {
                if(originalArray[i][j] != 0){
                   count++;
                   sparseArray[count][0] = i;
                   sparseArray[count][1] = j;
                   sparseArray[count][2] = originalArray[i][j];
                }
            }
        }
        //4.输出稀疏数组
        System.out.println("组建后稀疏数组:");
        for (int i = 0; i < sum+1; i++) {
            for (int j = 0; j < 3; j++) {
                System.out.print(sparseArray[i][j] + "\t");
            }
            System.out.println();
        }
    }
}

二、数组模拟循环队列

1.使用数组模拟环形队列思路分析

(1).front变量的含义做一个调整:front就指向队列的第一个元素,即arr[front]就是队列的第一个元素,front的初始值为0
(2).rear变量的含义做一个调整:rear指向队列的最后一个元素的后一个位置,因为希望空出一个位置作为约定,rear的初始值为0
(3).当队列满时,条件为(rear+1)%maxSize=front —满
(4).当队列为空时,条件为rear=front —空
(5).当我们这样分析时,队列中有效的个数为(rear+maxSize-front)%maxSize
(6).在之前的数组队列上进行修改,得到一个环形队列

代码实现:

public class ArrayQueueCircle {
    public static void main(String[] args) {
        CircleArray circleArray = new CircleArray(4);
        Scanner scanner = new Scanner(System.in);
        char key = ' ';
        boolean isFlag = true;
        while (isFlag){
            System.out.println("s(show):展示队列");
            System.out.println("a(add):添加数据到队列");
            System.out.println("g(get):取出队列数据");
            System.out.println("h(head):展示队列首元素");
            System.out.println("e(exit):退出程序");

            key = scanner.next().charAt(0);
            switch (key){
                case 's':
                    circleArray.show();
                    break;
                case 'a':
                    System.out.println("请输入要添加的数据:");
                    int number = scanner.nextInt();
                    circleArray.add(number);
                    break;
                case 'g':
                    try {
                        int getNumber = circleArray.get();
                        System.out.println("取出数据为:" + getNumber);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    break;
                case 'h':
                    try {
                        int first = circleArray.head();
                        System.out.println("首元素为:" + first);
                    } catch (Exception e) {
                        e.getMessage();
                    }
                    break;
                case 'e':
                    scanner.close();
                    isFlag = false;
                    System.out.println("退出程序");
                    break;
            }
        }
    }
}
class CircleArray{
    private int maxsize;
    private int front;
    private int rear;
    private int[] arr;

    public CircleArray(int maxsize) {
        this.maxsize = maxsize;
        front = 0;
        rear = 0;//rear此时指向最后一个数据的后一个位置
        arr = new int[maxsize];
    }
    public boolean isFull(){
        return (rear + 1) % maxsize == front;
    }
    public boolean isEmpty(){
        return rear == front;
    }
    public void add(int n){
        if(isFull()){
            System.out.println("队列已满,不能添加数据");
        }else{
            arr[rear] = n;
            rear = (rear + 1) % maxsize;
        }
    }
    public void show(){
        if(isEmpty()){
            System.out.println("队列为空,无数据");
        } else {
            int res = size();
            for (int i = front; i < front + res; i++) {
                System.out.println("arr[" + i + "] = " + arr[i]);
            }
        }
    }
    public int get(){
        if(isEmpty()){
            throw new RuntimeException("队列为空,没有数据");
        }else {
            int tem = arr[front];
            front = (front + 1) % maxsize;
            return tem;
        }
    }
    public int head(){
        if(isEmpty()){
            throw new RuntimeException("队列为空,没有数据");
        }else {
            return arr[front];
        }
    }
    //求出当前队列的有效数据个数
    public int size(){
        return (rear + maxsize -front) % maxsize;
    }
}
【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 07 堆、栈、表、矩阵、集合、队列、数组、字符串、树、图、动态规划、结构体、元组的算法01 当前段必须包含所有字符的最后出现位置。1. 字符串分割成最多片段2. 基因序列功能域划分3. 文本段落划分4. 音频声道分离5. 图像色彩分区6. 社交网络社群划分7. 蛋白质结构域8. 音乐乐章分段9. 代码模块划分10. 章节划分特征:一次扫描,贪心确定边界。 阅读详情

相关推荐

【信息科学与工程学】【通信工程】第七十九篇 网络规划中的方案中的数学建模01

编号学科网络领域产品核心知识点与数学方程式在网络设计中的详细作用理论/工程依据 关联知识和法律法规1概率论与数理统计​流量工程与负载均衡​路由器、交换机、SDN控制器核心知识点:​ 排队论 方程式:​ M/M/1队列平均等待时间 W=μ(μ−λ)λ​ 变量定义:​ λ = 平均到达率 (packets/s), μ = 平均服务率 (packets/s) 单位:​ packets/s, s 数值设计:​ 需满足 ρ=λ/μ<1 以保证队列稳定。 推导要点:​ 基于泊松到达过程与指

weixin_49199313的博客 328

稀疏数组增强for循环

稀疏数组

HeX_7的博客 380

使用STM输出互补SPWM波(三相各差120°)

使用STM32输出SPWM波形(三相各差120°)

hello011102的博客 7373

串口接收二维数组环形缓冲队列

串口接收二维数组环形缓冲队列 51单片机使用此方法可能效果不大。 此二维数组环形缓冲队列是我从一维数组环形缓冲队列改编而来,与一维数组理念相同。但是对于数据的处理要更加的方便。 环形缓冲区就是一个带“头指针”和“尾指针”的数组。“头指针”指向环形缓冲区中可读的数据,“尾指针”指向环形缓冲区中可写的缓冲空间。通过移动“头指针”和“尾指针”就可以实现缓冲区的数据读取和写入。在通常情况下,应用程序读取环形缓冲区的数据仅仅会影响“头指针”,而串口接收数据仅仅会影响“尾指针”。当串口接收到新的数组,则将数组保存到环

weixin_43756132的博客 1739

Fiddler Everywhere保姆级教程:10分钟搞定手机HTTPS抓包(附证书配置避坑指南)

本文提供Fiddler Everywhere移动端HTTPS抓包的保姆级教程,涵盖环境配置、代理设置、证书安装及常见问题排查。重点解析如何正确安装并信任Fiddler根证书以解密HTTPS流量,帮助开发者快速搭建抓包环境,高效分析应用网络行为,提升调试效率。

git9versioner的博客 705

手把手教你用示波器搞定PCIe 5.0 REFCLK时钟信号测量(附完整参数解读)

本文详细介绍了如何使用示波器进行PCIe 5.0 REFCLK时钟信号测量,包括示波器与探头的选择、关键参数的测量方法及解读,以及实战中的常见问题与解决方案。通过手把手教学和完整参数解读,帮助硬件工程师高效完成时钟信号测量,确保系统稳定性。

weixin_28704565的博客 359

算法(一)(稀疏数组、队列、环形队列)

kmp算法<部分匹配表> 汉罗塔 线性 栈 队列 列表 非线性 图 树

zhoulib__的博客 377

从代码到实践:手把手教你用EmbodiedOcc++实现高效3D占用预测(含ScanNet配置)

本文提供了EmbodiedOcc++框架在ScanNet数据集上实现高效3D占用预测的完整实践指南。从环境搭建、数据预处理入手,详细解析了其核心创新点——几何引导优化(GRM)与语义感知不确定性采样(SUS)的代码实现与配置,并分享了训练、评估及调参的实战技巧,帮助开发者快速掌握这一先进的3D感知技术。

terraform7cloud的博客 588

C语言循环数组做FIFO队列--一些认识

C语言循环数组做FIFO队列 在做通信时,FIFO队列queue是非常好用的,先完成接收通信把接收的数据存在队列里;然后再进行先进先出逐项处理。 C语言用循环数组,通过读位置和写位置循环来实现FIFO队列功能。即数组队列。 1 以1个字节为单位的数组队列的数据结构 使用数组队列,为了方便判断队列空和队列满,使用不完全填满队列,即保留一个元素始终不用 下

ARM+嵌入式 2万+

嵌入式工程师成长之路(1)——元件基础(试读版)

上拉电阻阻值选错导致MCU反复重启?0欧电阻竟然能“背锅”信号干扰?高精密采样电阻的温漂毁了整个控制系统?——这些问题,都是基础不牢!优快云硬件领域头部博主十年经验汇总,涵盖电阻分类、封装、实战选型、避坑指南,附带职业进阶路径,助你从小白进阶为“电路医生”!

云轩阁 34万+

FFMPEG音视频开发: Linux下采集音频(alsa-lib库)、视频(V4L2框架)数据编码并实时推流到RTMP流媒体服务器,达到直播功能(推流)

一、环境介绍 操作系统: VM虚拟机运行的ubuntu18.04 FFMPEG版本: 4.4.2 摄像头: 罗技USB摄像头、电脑自带摄像头 声卡:电脑自带声卡 二、FFMPEG、X264的安装 参考这里:FFMPEG开发: Linux下采集摄像头数据录制成MP4视频保存到本: 地https://blog.youkuaiyun.com/xiaolong1126626497/article/d...

2991

环形二维数组

一、题目 输出二维环形数组中最大子数组和 二、设计思想 把解决一维环形数组,和普通二维数组的方法结合起来街是解决二维环形数组的方法。 三、源代码 #include<iostream.h> #include<time.h> #include<stdlib.h> int qiumax(int arry[],int max) { ...

weixin_30520015的博客 427

SAP HANA 的一个王炸技能,Smart Data Access

SAP HANA Cloud近期推出Knowledge Graph Engine(KGE),支持RDF三元组存储和SPARQL查询,与向量引擎等组件协同实现混合检索。同时文章介绍了HANA的Smart Data Access(SDA)功能,它通过虚拟表技术实现跨系统联邦查询,支持30+种数据源(不包括PostgreSQL),适用于混合云场景。SDA通过谓词下推优化性能,典型应用包括冷热数据分层和跨系统报表分析。对于PostgreSQL连接需求,建议使用HANA的Smart Data Integration方

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 498

[数据结构与算法] 邂逅数组与队列

数据结构与算法一 线性结构与非线性结构稀疏数组及五子棋问题二维数组与稀疏数组的转化领会遍历二维数组的两种方式队列和银行排队问题银行排队问题队列与队列模拟 学习完部分大数据知识之后, 大数据阶段的学习就暂时告一段落了. 为了能够进入大厂修习, 因此特别在这端时间里通过学习韩顺平老师的数据结构与算法来复习下数据结构与算法. 与其说是复习不如说是预习,嘿嘿.我将不同于以往的写博方式, 重新和大家一起...

时间静止 4198

vue-vben-admin 打包编译报错Failed to resolve entry for package “@vben-core/design“ 的解决方法

如果你在你是不是在 apps/子目录下执行了 build?# 项目根目录 pnpm build而不是在下面单独打包。这个问题本身不复杂,但非常容易被误导去“怀疑依赖、怀疑配置、怀疑人生”。实际上,只要理解vue-vben-admin 是 monorepo 架构,很多类似问题都会迎刃而解。如果你后面还遇到 vben-admin 的构建、部署、权限或性能相关问题,这一套思路都很有用。希望这篇记录,能帮你节省至少半小时的排坑时间。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 424

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

01 稀疏数组和队列 【数据结构与算法学习笔记(Java)】

数据结构与算法(Java实现) 我的学习资料: 视频:尚硅谷Java数据结构与java算法(Java数据结构与算法) 书籍:《大话数据结构》 笔记中包括学习的内容,代码,同时自己总结了知识点速记(部分会带页内跳转,可点击跳转)供快速回顾和记忆学到的知识点。 0.线性结构和非线性结构 数据结构的底层存储方式只有两种:数组(顺序存储)和链表(链式存储)。 0.1 线性结构 特点:数据元素之间存在一对一的线性关系 顺序存储的线性表叫做顺序表,顺序表中的存储元素是连续的 链式存储的线性表叫做链表,链表中的存储

小智爱学习的博客 352

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

DS01稀疏数组和队列

文章目录一、稀疏数组和队列1.稀疏sparsearray数组1.1 定义1.2 思路1.3 代码2.队列2.1 定义2.2 思路2.3 循环队列代码2.3.1 说明2.3.2 代码 一、稀疏数组和队列 1.稀疏sparsearray数组 1.1 定义 1.2 思路 二维数组 转 稀疏数组的思路 遍历 原始的二维数组,得到有效数据的个数 sum 根据sum 就可以创建 稀疏数组 sparseArr int[sum + 1] [3] 将二维数组的有效数据数据存入到 稀疏数组 稀疏数组转原始的二维

Jerry&Crj的博客 219

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

稀疏数组、栈(用栈实现计算器)和队列

学习算法与数据结构已经一段时间了,之前学习了现在已经遗忘了一些,现在从头开始以自己的理解整理一遍,加深自己的印象。 稀疏数组 正常的二维数组会存在大部分重复的元素,而这些大量重复的元素在存储的过程中是没有必要且浪费空间的,所以有了稀疏数组。 稀疏数组:把大量重复的元素视为无效元素,创建一个N行3列的二维数组来存数据,第一行第一列存原始数组的行,第二列存原始数据的列,第三列存原始数据的有效数据...

Dichotomy_的博客 279

java_数据结构_1

1.稀疏矩阵 2.队列文章目录1.稀疏数组2.队列-单向3.队列循环 1.稀疏数组 ublic class demo01 { public static void main(String[] args) { int chew[][] = new int[11][11]; chew[1][1] = 21; chew[2][1] = 1; for(int[] row : chew) { for(int data : row) { System.out.print(dat

959 242

2021年10月学习周报01

2021年10月学习报告X32专项练习部分01 X32专项练习部分01 隐式类型转换 多线程 抽象类与接口的区别 方法重载 Java语言性特点 Java位运算 异常处理机制代码执行顺序

men方法栈帧的博客 229

计算机考研专业课之DS数据结构与算法学习笔记开源

2025年数据结构考研复习专栏笔记,课程来自王道考研数据结构课程+B站独家开源课程,笔记记录时长两年半,囊括包含了408、自命题的数据结构的所有重点考点、冷门考点。结合近20年408的考点考察范围,未来以后的数据结构考点也不太会有什么太大变化,所以只看这一份就够了!笔记现已开源。助力26/27/28.../40 考研,如果工作面试有数据结构的考察也可以看。 此为系统自动推送,不可能不看!适用人群:于DS自命题和408统考

qq_56741313的博客 948

C语言图的广度优先搜索实战(队列优化大揭秘)

掌握C语言图的广度优先搜索队列实现,高效解决图遍历问题。适用于路径查找、网络遍历等场景,结合队列优化提升性能,代码简洁易懂。算法清晰可靠,值得收藏。

ProceSeed的博客 425

算法修炼十八层:从数据结构到核心算法,程序员入门心法全解析

在计算机科学中,数据结构与算法是构建高效程序的基石。数据结构如数组、链表、哈希表等,定义了数据的组织、存储与访问方式,其核心原理在于通过特定的逻辑结构管理内存,以实现对数据的快速增删改查。掌握这些基础结构,能显著提升程序性能,是解决实际工程问题的关键。算法则是在数据结构之上,定义了一系列解决问题的清晰指令,如排序、查找、递归和动态规划等,其价值在于以最优的时空复杂度处理数据。这些技术广泛应用于搜索引擎、推荐系统、数据库索引及网络通信等场景。本文以“练气十八层”为隐喻,系统拆解了算法入门必须掌握的十八个核心基

weixin_30466039的博客 388

队列Java实现

队列 1、数组实现队列 1)基本思路 (1)类属性 ①数组的最大容量:maxSize ②数组:arr[] ③队头:front 指向队首的前一个元素 ④队尾:rear 指向队尾元素 (2)类方法 ①判断队列是否为空 ②判断队列是否已满 ③入队 ④出队 ⑤显示队列所有元素 ⑥显示队首元素 2)缺点:数组使用一次就不可再使用,出队列之后数组中空出来的位置无法使用,因此要改进为一个环形队列。 class ArrayQueue{ private int maxSize; private int arr[]; p

qq_40516377的博客 276

数组应用——二维数组转稀疏数组、循环队列

1.数组实现循环队列 import java.util.Scanner; public class CircleArrayQueueDemo { public static void main(String[] args) { //测试循环队列 //创建一个队列 CircleArray queue = new CircleArray(4);...

零栀 1008

C语言实现循环队列(队列可存储字符串)

项目原因,需要写一个队列来存储串口实时输出的字符串。看了网上很多博文和一些数据结构的数据,给的例子都是实现对单个数字或者字符的队列操作,并没有实现在队列中存储字符串。这里分享一种可以实现的方法。 关于队列的一些基本的概念这里就不在介绍,下面直接上代码。 主要实现了: 将字符串存入队列之中,代码中的MAXSIZE 是最大的队列长度。实际中由于够成了循环队列,所以这个最大存储长度只有(MA...

浪迹天涯的博客 6051
下一篇: 数据结构 02 - 单链表的使用 && 环形链表的实现与应用
终难忘世外仙株寂寞林
博客等级 码龄6年 0粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值