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

文章目录

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

在这里插入图片描述

数组模拟单链表

首先类比结构体存储单链表,我们需要一个存放下一个节点下标的数组,还需要一个存储当前节点的值的数组,其次就是一个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,表示下一个节点的下标是0idx=0;
}
//在头部插插入节点
void PushFront(int x)
{//更新新节点存储的值e[idx]=x;//新节点的下一个节点是原来的头结点ne[idx]=head;//更新头结点,为idxhead=idx;//更新idxidx++;
}
//在第k个节点的后面插入一个数据
void Insert(int k,int x)
{//更新存储节点值的数组e[idx]=x;//准备插入的节点的下一个节点是k节点指向的下一个节点ne[idx]=ne[k];//k节点指向的下一个节点是idxne[k]=idx;//更新idxidx++;
}
//删除第k个节点的后一个节点
void Earase(int k)
{//第k个节点的下一个节点是第k个节点的下下个节点ne[k]=ne[ne[k]];
}int main()
{//初始化Init();//输入操作数cin>>M;while(M--){int x,k;char op;//根据样例写一个ifelsecin>>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的左边是kl[idx]=k;//k的右边的指向的左边是idxl[r[k]]=idx;//k指向的右边是idxr[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 都设置为当前的 idxhead = 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.mzph.cn/bicheng/3244.shtml

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

相关文章

Python 实现视频去抖动技术

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 视频去抖动是视频处理中的一项重要技术&#xff0c;它可以有效地减少视频中由于相机震动或手…

嵌入式开发学习--进程、线程

什么是进程 进程和程序的区别 概念 程序&#xff1a;编译好的可执行文件&#xff0c;存放在磁盘上的指令和数据的有序集合&#xff08;文件&#xff09;&#xff0c;程序是静态的&#xff0c;没有任何执行的概念。 进程&#xff1a;一个独立的可调度的任务&#xff0c;执行一…

恶补《操作系统》3_1——王道学习笔记

3内存管理 3.1_1 内存的基础知识 1、什么是内存&#xff0c;作用 &#xff08;1&#xff09;内存&#xff1a;内存用来存放数据。程序执行前需要先放到内存中才能被CPU处理――缓和CPU与硬盘之间的速度矛盾。 &#xff08;2&#xff09;内存存储单元&#xff1a;每个地址对应…

AIGC技术的发展现状和未来趋势

AIGC&#xff08;人工智能生成内容&#xff09;技术是指利用人工智能算法自动生成文本、图像、音频、视频等各类内容的技术。随着深度学习等技术的快速发展&#xff0c;AIGC技术在最近几年取得了显著进步&#xff0c;并在多个领域展现出巨大的潜力。 ​ 编辑 发展现状&#x…

ARM功耗管理背景及挑战

安全之安全(security)博客目录导读

服务器网站漏洞怎么修复

服务器网站漏洞的修复是一个关键且复杂的过程&#xff0c;涉及到多个层面的安全加固。以下是一个关于如何修复服务器网站漏洞的详细指南。安全狗专业做服务器安全&#xff0c;有任何服务器安全问题都可以找安全狗哦. ​一、识别和分析漏洞 首先&#xff0c;要确定服务器网站存在…

Linux下的基本指令(1)

嗨喽大家好呀&#xff01;今天阿鑫给大家带来Linux下的基本指令&#xff08;1&#xff09;&#xff0c;下面让我们一起进入Linux的学习吧&#xff01; Linux下的基本指令 ls 指令pwd命令cd 指令touch指令mkdir指令(重要)rmdir指令 && rm 指令(重要)man指令(重要)cp指…

基于 NXP iMX8MM 测试 Secure Boot 功能

By Toradex秦海 1). 简介 嵌入式设备对于网络安全的要求越来越高&#xff0c;而 Secure boot就是其中重要的一部分。 NXP i.MX8MM/i.MX8MP 处理器基于 HABv4 特性来提供 Secure boot 启动过程中的 Chain of Trust&#xff1b; HABv4 是基于公共密钥加密 (Public Key Cryptogr…

C语言进阶:指针的进阶(上)

首先 在学习新知识之前 我们先来回顾下之前的学习的内容 1 指针是个变量 用来存放地址 地址唯一标识的一块内存空间 2 指针的大小是固定的4/8字节&#xff08;32位平台/64位平台&#xff09; 3 指针有类型的 指针的类型决定了两点 一个是指针操作的权限以及整数的步长 4 指针的…

神经网络项目:全连接网络和卷积网络实现水果三分类项目

水果三分类项目 Git源码&#xff1a;传送门 水果种类&#xff1a;草莓、树莓、桑葚 0&#xff1a;草莓 strawberry1&#xff1a;树莓 raspberry2&#xff1a;桑葚 mulberry 项目设计 获取数据 spider.py数据清洗 cleaner.py自定义数据集 dataset.py网络构建 net.py训练模型 t…

git工具简单使用

文章目录 git上传克隆README.gitignore常用指令冲突 git 进行版本控制的版本控制器。安装git yum install -y git 配置git git config --global user.email "youexample.com" 告诉git你的邮箱是什么&#xff1f;最好输入你的gitee的注册邮箱git config --global …

人工智能(pytorch)搭建模型28-基于Transformer的端到端目标检测DETR模型的实际应用,DETR的原理与结构

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型28-基于Transformer的端到端目标检测DETR模型的实际应用&#xff0c;DETR的原理与结构。DETR&#xff08;Detected Transformers&#xff09;是一种基于Transformer的端到端目标检测模型&…

把 KubeBlocks 跑在 Kata 上,真的可行吗?

背景 容器的安全性一直是广受关注的话题。这个领域也产生了很多不错的开源项目。Kata就是其中之一。 Kata Containers&#xff08;简称 Kata&#xff09;是一种开源项目&#xff0c;它提供了一种安全而高性能的容器运行时环境。Kata Containers 利用虚拟化技术&#xff08;通常…

【算法刷题 | 贪心算法03】4.25(最大子数组和、买卖股票的最佳时机|| )

文章目录 4.最大子数组和4.1题目4.2解法一&#xff1a;暴力4.2.1暴力思路4.2.2代码实现 4.3解法二&#xff1a;贪心4.3.1贪心思路4.3.2代码实现 5.买卖股票的最佳时机||5.1题目5.2解法&#xff1a;贪心5.2.1贪心思路5.2.2代码实现 4.最大子数组和 4.1题目 给你一个整数数组 n…

Mac下XDebug安装

文章目录 1、下载对应的版本2、编译XDebug3、配置XDebug4、配置PhpStormDebug一下 前置工作 Mac下安装HomebrewMac下brew安装php7.4 1、下载对应的版本 首先按照支持的版本和兼容性来下载对应的版本&#xff0c;此表列出了仍支持哪些 Xdebug 版本&#xff0c;以及哪些版本可用…

GPT的全面历史和演变:从GPT-1到GPT-4

人工智能新篇章&#xff1a;GPT-4与人类互动的未来&#xff01; 本文探讨了生成式预训练 Transformer (GPT) 的显着演变&#xff0c;提供了从开创性的 GPT-1 到复杂的 GPT-4 的旅程。 每次迭代都标志着重大的技术飞跃&#xff0c;深刻影响人工智能领域以及我们与技术的互动。 我…

linux+ndk把jni制作成so库供apk使用(基础)

环境配置之类的我之前的博客有写,这篇文章我们就直接开始 1.在有ndk配置的服务器创建文件夹,文件夹再创建jni文件夹,jni文件夹里面放置Application.mk,Android.mk与test.c,因为我的ndk运行配置默认是项目下面的jni目录,所以我需要多一个jni目录 2.这里的Application.mk写的是架…

OpenHarmony语言基础类库【@ohos.util (util工具函数)】

ohos.util (util工具函数) 该模块主要提供常用的工具函数&#xff0c;实现字符串编解码&#xff08;[TextEncoder])&#xff0c;[TextDecoder]&#xff09;、有理数运算&#xff08;[RationalNumber8]&#xff09;、缓冲区管理&#xff08;[LRUCache9]&#xff09;、范围判断&…

5款好用的监控员工电脑软件推荐 (如何监控员工上班工作情况)

在现代的商业环境中&#xff0c;管理和监控员工的工作内容是至关重要的。 为了确保员工的工作效率和质量&#xff0c;公司需要使用一些工具来监控他们的工作进程。 以下是五款实用的监控员工工作内容的软件。 域智盾软件 域智盾是一款专为企业打造的智能管理系统。 它借助人…

Vivado-IP-DDS and Testbench Learning

DDS内部结构 实现流程 首先新建一个工程&#xff0c;创建bd文件&#xff0c;添加DDS Compiler核&#xff0c;此处不多赘述 Block Design 在观测输出的信号时&#xff0c;需要将最高位符号位的信号取反&#xff0c;这样才能输出正弦波&#xff0c;否则输出的波形如下图所示 将t…