数组模拟几种基本的数据结构

news2025/1/13 2:46:21

文章目录

  • 数组模拟单链表
  • 数组模拟双链表
  • 数组实现栈
  • 数组模拟队列
  • 总结

在这里插入图片描述

数组模拟单链表

首先类比结构体存储单链表,我们需要一个存放下一个节点下标的数组,还需要一个存储当前节点的值的数组,其次就是一个int类型的索引,这个索引指向的是下一个我们准备用的空间,还需要一个head,head存放的是头结点的下标

我们用下面一道题来更深刻的理解*

在这里插入图片描述

代码展示:

#include<iostream>
using namespace std;
//确定数组的大小
const int N = 100000;
//一个存放值,一个存放下一个节点的下标
int e[N],ne[N];
//一个是下一个节点的索引,一个变量存储头节点
int idx,head;
//操作次数
int M;

void  Init()
{
	//零个节点的情况下我们的head等于-1,表示还没有任何节点
    head=-1;
    //idx定义为0,表示下一个节点的下标是0
    idx=0;
}
//在头部插插入节点
void PushFront(int x)
{
	//更新新节点存储的值
    e[idx]=x;
    //新节点的下一个节点是原来的头结点
    ne[idx]=head;
    //更新头结点,为idx
    head=idx;
    //更新idx
    idx++;
}
//在第k个节点的后面插入一个数据
void Insert(int k,int x)
{
	//更新存储节点值的数组
    e[idx]=x;
    //准备插入的节点的下一个节点是k节点指向的下一个节点
    ne[idx]=ne[k];
    //k节点指向的下一个节点是idx
    ne[k]=idx;
    //更新idx
    idx++;
}
//删除第k个节点的后一个节点
void Earase(int k)
{
	//第k个节点的下一个节点是第k个节点的下下个节点
    ne[k]=ne[ne[k]];
}


int main()
{
	//初始化
    Init();
    //输入操作数
    cin>>M;
    while(M--)
    {
        int x,k;
        char op;
        //根据样例写一个ifelse
        cin>>op;
        if(op=='H')
        {
            cin>>x;
            PushFront(x);
        }
        else if(op=='D')
        {
            cin>>k;
            if(!k) head=ne[head];
            Earase(k-1);
        }
        else
        {
            cin>>k>>x;
            Insert(k-1,x);
        }
    }
    //输出数据
    for(int i=head;i!=-1;i=ne[i])cout<<e[i]<<' ';
    return 0;
}

数组模拟双链表

双链表的实现和单链表类似,只不过我们需要三个数组,一个数组存储指向左边的的上一个节点的下标,一个数组存储下一个节点的下标,还有一个数组存储当前节点的值,还需要一个idx索引下一个元素。

看题!

题目在这里插入图片描述
样例
在这里插入图片描述

代码展示:

#include<iostream>
using namespace std;
const int N=100000;
int l[N],r[N],idx;
int e[N];

int m;

void Init()
{
    r[0]=1;
    l[1]=0;
    idx=2;
}
void Push_Right(int k,int x)
{
    //赋值
    e[idx]=x;
    //idx的右边是k节点的右边的节点
    r[idx]=r[k];
    //idx的左边是k
    l[idx]=k;
    //k的右边的指向的左边是idx
    l[r[k]]=idx;
    //k指向的右边是idx
    r[k]=idx;
    //idx++;
    idx++;
}

void Earase(int k)
{
    l[r[k]]=l[k];
    r[l[k]]=r[k];
}

int main()
{
    cin>>m;
    Init();
    while(m--)
    {
        int k=0,x=0;
        string op;
        cin>>op;
        //在零的右边插入
        if(op == "L")
        {
            cin>>x;
            Push_Right(0,x);
        }
        //在1的左边插入,1代表最后一个节点,所以只需要在最后一个节点的左边插入
        else if(op == "R")
        {
            cin>>x;
            Push_Right(l[1],x);
        }
        //删除,因为idx是从2开始的,他是删除第k个节点,存值的节点是从2开始,所以删除第k个
        //实际是删除第k+1个
        else if(op == "D")
        {
            cin>>k;
            Earase(k+1);
        }
        //在第看个节点的左边插入,相当于在第k+1个节点的左边节点的右边插入一个值
        else if(op=="IL")
        {
            cin>>k>>x;
            Push_Right(l[k+1],x);
        }
        //在右边插入,相当于就是在第k+1哥节点的右边插入一个数
        else if(op=="IR")
        {
            cin>>k>>x;
            Push_Right(k+1,x);
        }
    }
    //打印,第一个节点是在0节点的右边开始,然后到1结束
    for(int i=r[0];i!=1;i=r[i])cout<<e[i]<<' ';
    cout<<endl;
    return 0;
}

数组实现栈

数组实现栈和数组实现单链表类似,甚至比单链表更简单,由于栈先进后出的性质,所以我们根本、不需要用到什么head

看题!

题目
在这里插入图片描述
样例
在这里插入图片描述

代码展示:

#include<iostream>
using namespace std;
const int N=100000;
//存储值的数组和存储下一个节点下标的数组
int e[N],ne[N];
//索引
int idx;
//操作数
int m;
void Init()
{
	//这里我们直接将idx置零
    idx=0;
}
void Push(int x)
{
    e[idx]=x;
    idx++;
}
void Pop()
{
    idx--;
}

bool Empty()
{
    return idx==0;
}
int Query()
{
    return e[idx-1];
}
int main()
{
    cin>>m;
    Init();
    while(m--)
    {
        string op;
        cin>>op;
        int x;
        if(op=="push")
        {
            cin>>x;
            Push(x);
        }
        else if(op=="pop")
        {
            Pop();
        }
        else if(op=="empty")
        {
            if(Empty())
            {
                cout<<"YES"<<endl;
            }
            else
            {
                cout<<"NO"<<endl;
            }
        }
        else if(op=="query")
        {
            cout<<Query()<<endl;
        }
    }
    return 0;
} 

数组模拟队列

数组模拟队列类似于数组模拟单链表,但是由于队列的特殊性质,先进先出,所以我们需要一个指向头的索引,当我们需要出队列的时候,时间复杂度可以达到O(1),也需要一个存储值的数组,和存储下一个节点下标的数组

看题!

**题目在这里插入图片描述
样例
在这里插入图片描述

代码展示:

#include<iostream>
using namespace std;
const int N=100000;
int head,idx,e[N],ne[N];
int tail;
int m;
void Init()
{
    head=-1;
    idx=0;
    tail=-1;
    m=0;
}

void Push(int x) {
    e[idx] = x;
    ne[idx] = -1; // 将新元素的下一个位置设置为 -1,表示末尾
    if (head == -1) 
    { 
        // 如果队列为空,将 head 和 tail 都设置为当前的 idx
        head = idx;
        tail = idx;
    } 
    else 
    {
        ne[tail] = idx; // 将当前的 tail 指向新元素的位置
        tail = idx; // 更新 tail
    }
    idx++;
}



void Pop()
{
    head=ne[head];
    if(head==-1)
    {
        tail=-1;
    }
}
bool Empty()
{
    return head==-1;
}
int Query()
{
    return e[head];
}
int main()
{
    Init();
    cin>>m;
    while(m--)
    {
        string op;
        cin>>op;
        int x;
        if(op=="push")
        {
            cin>>x;
            Push(x);
        }
        else if(op=="pop")
        {
            Pop();
        }
        else if(op=="empty")
        {
            if(Empty())
            {
                cout<<"YES"<<endl;
            }
            else
            {
                cout<<"NO"<<endl;
            }
        }
        else if(op=="query")
        {
            cout<<Query()<<endl;
        }
    }
    return 0;
}

总结

在本文中,我们深入探讨了如何使用数组来模拟基本的数据结构,包括栈、队列和链表。通过这些模拟,我们不仅加深了对这些数据结构的理解,还学会了如何利用数组的特性来实现它们。通过使用数组,我们可以更好地理解数据结构的底层原理,并且在实际编程中更灵活地应用这些概念。无论是在算法竞赛中还是在实际项目中,对数组模拟数据结构的掌握都将为我们带来更多的解决方案和优化思路。希望本文能够帮助你更深入地理解数组和数据结构,并在你的编程旅程中有所启发!

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

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

相关文章

【智能算法】金豺优化算法(GJO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2022年&#xff0c;N Chopra等人受到金豺狩猎行为启发&#xff0c;提出了金豺优化算法&#xff08;Golden Jackal Optimization, GJO&#xff09;。 2.算法原理 2.1算法思想 GJO 模拟金豺协同狩猎…

vlan的学习笔记2(vlan间通信)

1.使用路由器的物理接口 原理&#xff1a;在二层交换机上配置VLAN&#xff0c;每个VLAN单独使用一个交换机接口与路由器互联。路由器使用两个物理接口&#xff0c;分别作为VLAN 10及VLAN 20内PC的默认网关&#xff0c;使用路由器的物理接口实现VLAN之间的通信。 实验1&#x…

关于后台管理系统的一些系统监控案例

关于后台管理系统的一些系统监控案例 在阅读开源的项目的时候&#xff0c;发现了一个很神奇的功能。 https://github.com/valarchie/AgileBoot-Back-End 我这个是本地去运行的&#xff0c;发现他可以检测到这么多的数据 下面我们就来看他是如何进行的这样一个检测 我们首先…

美国网站服务器解决方案

在当今互联网时代&#xff0c;网站是企业宣传、营销和销售的最好方式&#xff0c;因此&#xff0c;选择一个适合自己企业的网站服务器解决方案很重要。美国作为全球网络基础设施最发达的国家之一&#xff0c;其网站服务器解决方案具有以下特点&#xff1a; 一、安全性高 作为全…

【C# 类和方法】

在C#中&#xff0c;类是面向对象编程的核心概念之一&#xff0c;允许定义对象的结构和行为。类是创建对象的蓝图&#xff0c;它包含了数据成员&#xff08;属性&#xff09;和方法。 C#类的定义示例&#xff1a; public class Person {// 属性&#xff08;字段&#xff09;pub…

校园一卡通解决方案概述

在20世纪数字化的时代背景之下&#xff0c;校园管理需要跟随时代的脚步共同向智能化方向迈进。现在学校的环境都在不断的升级扩展&#xff0c;各种教学设备不断的被纳入校园管理体系中&#xff0c;让校园管理的规模和内容不断的膨胀。在这种环境下&#xff0c;如果继续按照以前…

vue3+node.js+mysql+ant design实现表格的查询功能

今日主要分享如何运用vue、nodejs、mysql及ant design构建表格数据查询功能&#xff0c;这也是众多项目开发者关注的问题。最关键在于前端与后端的协作&#xff0c;后端数据则通过nodejs编写。尽管涉及多项技术&#xff0c;看似复杂&#xff0c;但实际操作却并非困难。当然&…

区块链 | OpenSea 相关论文:Toward Achieving Anonymous NFT Trading(三)

&#x1f951;原文&#xff1a; Toward Achieving Anonymous NFT Trading VII 讨论&#xff1a;关于匿名性与市场平台的困境 在本文的这一部分&#xff0c;我们将讨论关于隐藏 NFT 所有者地址的困境&#xff0c;以及为什么像 OpenSea 这样的 NFT 市场平台几乎必须得到完全的信…

Redis中的Lua脚本(六)

Lua脚本 清空repl_scriptcache_dict字典 每当主服务器添加一个新的从服务器时&#xff0c;主服务器都会清空自己的repl_scriptcache_dict字典&#xff0c;这是因为随着新从服务器的出现&#xff0c;repl_scriptcache_字典里面记录的脚本已经不再被所有从服务器载入过&#xf…

mongodb 安装问题

1. mongodb启动时显示 Illegal instruction (core dumped) mongodb 5.0之后(包括5.0) 开始使用需要使用 AVX 指令集 2.启动时报错 ERROR: child process failed, exited with 1 通过指令 bin/mongod --repair 或 ./bin/mongod -f configs/mongodb.conf --repair查看报错信息…

电力系统IEC-104报文主要常用详解

文章目录 1️⃣ IEC-1041.1 前言1.2 报文分类1.3 U帧报文1.3.1 常见报文1.3.1 报文解析 1.4 S帧报文1.4.1 说明1.4.2 报文解析 1.5 I帧报文1.5.1 报文解析 1.6 控制域I帧报文S帧报文U帧报文介绍 1.7 ASDU1.7.1 常见类型标识1.7.2 常见结构限定词1.7.3 常见传送原因1.7.4 信息体…

主食冻干哪个国家的好?全网热销款品控好的主食冻干必买

主食冻干哪个国家的好&#xff1f;谈及主食冻干哪款好&#xff0c;进口的主食冻干总是能被提名。不论是在哪个电商平台搜索“主食冻干”&#xff0c;都会发现那些备受推崇是进口主食冻干。从销售数据上看&#xff0c;这些进口冻干在大型促销活动如双11、618中的销量一直居高不下…

ctfshow菜狗杯 web 无算力以及easyPytHon_P

web签到题 error_reporting(0); highlight_file(__FILE__);eval($_REQUEST[$_GET[$_POST[$_COOKIE[CTFshow-QQ群:]]]][6][0][7][5][8][0][9][4][4]);套娃传参 中文要编码 Cookies &#xff1a;CTFshow-QQ%E7%BE%A4:a POST:ab GET:?bc&c[6][0][7][5][8][0][9][4][4]syste…

eNSP学习——静态路由及默认路由基本配置

目录 知识背景 实验目的 实验步骤 实验内容 实验拓扑 实验编址 实验前期准备 实验步骤 1、基本配置&#xff08;按照实验编址设置好对应的IP地址&#xff09; 2、是实现主机之间的通信 3、实现全网全通来增强网络的可靠性 4、使用默认路由实现简单的网络优化 需要各…

ROS摄像机标定

文章目录 一、环境准备二、摄像头标定2.1 为什么要标定2.2 标定前准备2.2.1 标定板2.2.2 摄像头调焦 2.3 开始标定2.4 测试标定结果 总结参考资料 一、环境准备 安装usb_cam相机驱动 sudo apt-get install ros-noetic-usb-cam 安装标定功能包 sudo apt-get install ros-noet…

ERP系统直击模切企业痛点,提升企业供应链效率

随着全球化经济的不断发展&#xff0c;供应链管理越来越成为企业经营的核心竞争力之一。因此&#xff0c;越来越多的企业正在积极寻找转型升级之路&#xff0c;对于生产制造模切企业来说&#xff0c;ERP系统尤其关键。 尽管ERP系统解决了企业资源计划的问题&#xff0c;但在模…

【论文速读】|大语言模型(LLM)智能体可以自主利用1-day漏洞

本次分享论文&#xff1a; LLM Agents can Autonomously Exploit One-day Vulnerabilities 基本信息 原文作者&#xff1a;Richard Fang, Rohan Bindu, Akul Gupta, Daniel Kang 作者单位&#xff1a;无详细信息提供 关键词&#xff1a;大语言模型, 网络安全, 1-day漏洞, …

粤嵌—2024/4/24—删除有序数组中的重复项 ||

代码实现&#xff1a; 方法一&#xff1a;双指针 int removeDuplicates(int *nums, int numsSize) {int l 0, r 0;while (r < numsSize) {if (r > 1 && nums[r] nums[l - 1] && nums[r] nums[l - 2]) {r;} else {nums[l] nums[r];l;r;}}return l; }…

【面试题】java后端开发实习(含答案)

java后端开发实习生-常见面试题 1&#xff09;JDK,JRE,JVM的关系 JDK JRE java开发工具JRE JVM java核心类库 2&#xff09;String类的常用方法 1.关于字符串获取方面 length 获取长度charAt 获取指定索引的字符indexOf 获取字符所在的索引位置lastIndexOf 获取字符所在…

电脑自带dll修复在哪里打开?教你如何快速修复dll丢失问题

MSVCP140.dll文件作为Windows操作系统中不可或缺的一环&#xff0c;对众多基于C编译的应用程序的正常运行起着关键作用。在我深入研究和处理与该文件相关问题的过程中&#xff0c;积累了丰富的认知和实践经验。以下是我对MSVCP140.dll文件的总体介绍以及针对其丢失问题的解决方…