深入理解数据结构(2)——用数组实现队列

news2024/9/30 3:23:28

数组是一种数据结构,队列也是一种数据结构。它们都是由基础的语法实现的。

如果一个数据结构可以用另外的数据结构来实现,那么可以有力的证明——“数据结构是一种思想”,是一种讲语法组合起来实现某种功能的手段

“整体大于局部”

一、队列的特点——要实现哪些功能?

从尾进,从头出

对于数组来说,每次从尾部插入元素,从头部删除元素。当数组后端插满元素的时候,此时前端删除元素就会导致——数组前端因为删除元素变空,后部因插入元素变满。如何解决这个问题?

我们可以设想有这样一个环形数组——刚开始两只指针front和rear都在0下标。每放入一个元素,rear就会往后走一步;每从队头front处出一个元素,front就会往后走一步(但是移除数据会导致前面位置有空缺)。如果rear移到最后一位是,再插入元素,rear就会移到数组的0下标处。这样问题就得到解决。

这里有两个问题:1、rear从7下标到0下标怎么过去?2、如何判断此事是空还是满?

问题1:不要用rear++,因为无法处理7下标到0下标的问题,用——rear = (rear + 1) % length

问题2:rear下一位是front,说明是满的。如果rear和front的下标是相同的,说明是空的

二、代码实现

class MyCircularQueue {

    private int[] elem;
    private int front;//表示队列的头
    private int rear;//表示队列的尾

    public MyCircularQueue(int k) {
/*这里创建数组时要多用一个空间,如果想要放置7个元素的话,在放第6个元素的时候,rear在最后一
*个下标处,他后面就是front。如果此时放入第7个元素,会被判定为“满”。所以要多要一个空间
*/
        this.elem = new int[k+1];
    }

    /**
     * 入队列     
     */
    public boolean enQueue(int value) {
        //1、检查是否队列是满的
        if(isFull()){
            return false;
        }
        
        elem[rear] = value;
        rear = (rear+1) % elem.length;
        return true;
    }

    /**
     * 出队列
     */
    public boolean deQueue() {
        if(isEmpty()) {
            return false;
        }
        //front++;
        front = (front+1) % elem.length;
        return true;
    }

    /**
     * 得到队头元素
     */
    public int Front() {
        if(isEmpty()) {
            return -1;
        }
        return elem[front];
    }

    /**
     * 得到队尾元素
     */
    public int Rear() {
        if(isEmpty()) {
            return -1;
        }
        //return (rear-1);  不可以这样写,因为当rear在0下标时会为-1
        int index = (rear == 0) ? elem.length-1 : rear-1;
        return elem[index];
    }

    public boolean isEmpty() {
        return front == rear;
    }

    /**
     * 队列是否为满
     */
    public boolean isFull() {
        //如果real的下一位是front,则说明是满的
       /* if( (rear+1) % elem.length == front) {
            return true;
        }
        return false;*/
        return (rear+1) % elem.length == front;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1140093.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大模型相关概念

GGML 以纯C语言编写的框架,让用户可以在MacBook电脑上轻松运行大型语言模型,这种模型通常在本地运行成本较高。目前,这一框架主要被业余爱好者使用,但在企业模型部署方面也有广泛的应用前景。 量化快速入门 我们首先简单介绍一下…

原生JavaScript实现的SPA单页应用(hash路由)

什么叫做SPA单页应用 单页Web应用 (single page web application,SPA) ,就是只有一张Web页面的应用,是加载单个HTML 页面并在用户与应用程序交互时动态更新该页面的Web应用程序。 单页应用的说法是在JavaScript和AJA…

超写实数字人小灿加入,助力火山语音全类型虚拟数字人应用创新

当发现更多AI科技作用于日常生活时,你是否想过竟然有一天会与AI数字人做同事?日前,火山语音团队重磅推出了一位神秘新成员——首个超写实数字员工小灿!这位新同事不仅形象清新美丽,还有着很强的亲和力,大幅…

ardupilot开发 --- CAN BUS、DroneCAN 、UAVCAN 篇

1. CAN BUS、DroneCAN 、UAVCAN 区别 UAVCAN是一种轻量级协议,旨在通过CAN BUS 在航空航天和机器人应用中实现可靠通信。 UAVCAN网络是分散的对等网络,其中每个对等体(节点)具有唯一的数字标识符 - 节点ID,并且仅需要…

minio + linux + docker + spring boot实现文件上传与下载

minio docker spring boot实现文件上传与下载 1.在linux上安装并启动docker2.在docker中拉取minio并启动3.Spring Boot 整合 minio4.测试 minio 文件上传、下载及图片预览等功能 1.在linux上安装并启动docker 检查linux内核,必须是3.10以上 uname ‐r安装docker…

没有电脑也不用担心,在Android设备上也可以轻松使用ppt

PowerPoint是制作幻灯片的好工具,无论是工作、学校还是个人使用。但有时你无法使用电脑或笔记本电脑,你必须在旅途中做演示。 这就是PowerPoint for Android派上用场的地方。它允许你在移动设备上创建、编辑和呈现幻灯片。以下是要遵循的步骤&#xff1…

[每周一更]-(第69期):特殊及面试的GIT问题解析

整合代码使用过程的问题,以及面试遇到的细节,汇总一些常用命令的对比解释和对比; 1、fetch和pull区别 git fetch是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。 git pull则是将远程主机的最新内…

unity button移动位置some values driven by canvas

1 可以在button父节点把限制取消勾选 2 在不动整个布局的情况下,只修改局部变量:忽略布局即可

Instagram引流技巧:如何充分利用社交媒体来增加独立站流量

在数字时代,社交媒体已成为推广产品、服务和内容的重要工具之一。Instagram,作为其中之一,以其视觉化特点和庞大的用户基础,为独立站和个人品牌提供了难得的机会。本文Nox聚星将和大家探讨如何充分利用Instagram,将其作…

【从瀑布模式到水母模式】ChatGPT如何赋能软件研发全流程

文章目录 🎄前言🍔本书概要🌺内容简介🌺作者简介🌺专家推荐🛸读者对象🍔彩蛋 🎄前言 计算机技术的发展和互联网的普及,使信息处理和传输变得更加高效,极大地…

2核4G服务器 如何设计编码一款扛得住高并发高吞吐量的商品秒杀系统

题目 最近要参加一个秒杀商品系统比赛 【题目】设计并演示一款商品秒杀系统 【要求】设计并实现程序,模拟该商品秒杀系统的基本功能包括但不限于: 1.商品管理:每个商品都有唯一的ID、名称、库存数量和秒杀价格。 2.用户管理:每个…

MyBatis 基础用法详解

目录 什么是MyBatis 前置工作 创建MyBatis项目 MyBatis的使用 1.查询 1.1全查询 1.2传参查询 2.删除 3.修改 4.添加 什么是MyBatis MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设…

使用Python实现一个简单的斗地主发牌

使用Python实现一个简单的斗地主发牌 1.源代码实现2.实现效果 1.源代码实现 import random# 定义扑克牌的花色和大小 suits [♠, ♥, ♣, ♦] ranks [2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A]# 初始化一副扑克牌 deck [suit rank for suit in suits for rank in ranks]# …

怎么用Python写一个浏览器集群框架

这是做什么用的 框架用途 在采集大量新闻网站时,不可避免的遇到动态加载的网站,这给配模版的人增加了很大难度。本来配静态网站只需要两个技能点:xpath和正则,如果是动态网站的还得抓包,遇到加密的还得js逆向。 所以…

ChatGPT如何赋能探究深度学习、神经网络与卷积神经网络

计算机技术的发展和互联网的普及,使信息处理和传输变得更加高效,极大地改变了金融、商业、教育、娱乐等领域的运作方式。数据分析、人工智能和云计算等新兴技术,也在不断地影响和改变着各个行业。 如今,我们正在见证人工智能技术…

【Overload游戏引擎细节分析】PBR材质Shader

PBR基于物理的渲染可以实现更加真实的效果,其Shader值得分析一下。但PBR需要较多的基础知识,不适合不会OpenGL的朋友。 一、PBR理论 PBR指基于物理的渲染,其理论较多,需要的基础知识也较多,我在这就不再写一遍了&#…

如何构造强一致性系统?理解数据一致性里的2PC和TCC模式原理,以及如何做(有图)

背景 首先,读这篇文章的时候你应该先了解什么是事务、什么是分布式事务。 我这里举2个例子,典型场景有两个: 1、一个应用有两个数据库,一个数据库是订单,另一个数据库是积分,要求下订单的时候同时给用户积…

el-table添加固定高度height后高度自适应

0 效果 1 添加自定义指令 新建目录src/directive/el-table 在el-table目录下新建文件adaptive.js import { addResizeListener, removeResizeListener } from element-ui/src/utils/resize-event// 设置表格高度const doResize async(el, binding, vnode) > {// 获取表格…

Vben admin - 表格组件合并单元格

需求 最近在项目中有需求需要表格合并单元格,不但内容有合并的,操作列也需要合并,找遍vben官方例子,没有实现操作列合并的,只能硬着头皮实现,还好实现了,下面具体就是实现思路; 原…

再获Gartner认可!持安科技获评ZTNA领域代表供应商

近日,全球权威市场研究与咨询机构Gartner发布了《Hype Cycle for Security in China, 2023(2023中国安全技术成熟度曲线)》报告,对2023年的20个中国安全技术领域的现状与发展趋势进行了详细的分析与解读。 其中,持安科…