前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【数据结构】二次封装自己的数组(三)升级为动态数组

【数据结构】二次封装自己的数组(三)升级为动态数组

作者头像
MaybeHC
发布2024-04-23 19:02:06
690
发布2024-04-23 19:02:06
举报
文章被收录于专栏:技术之路技术之路

我们之前在我们的数组内部封装了静态的数组,如果当我们的数组增加,超过了我们数组所设置的容量时,程序会出现错误。 这里我们修改代码,当数组数据超过数组容量时进行扩容

修改添加方法

代码语言:javascript
复制
  //在index位置插入一个新元素e
        public void add(int index, E e)
        {
            if (size == data.Length)
                //扩容两倍
                resize(2 * data.Length);
            if (index < 0 || index > size)
                throw new ArgumentException("Add failed.Require index < 0 || index > size");
            for (int i = size - 1; i >= index; i--)
                data[i + 1] = data[i];
            data[index] = e;
            size++;
        }

添加扩容数组的方法

在数组数据超过容量时,我们将数组扩容2倍。创建一个新数组,容量为原来容量的两倍,将原数据拷贝进新数组,并改变data的引用。

代码语言:javascript
复制
 //扩容数组
        private void resize(int newCapacity)
        {
            E[] newData = new E[newCapacity];
            for(int i = 0; i < size; i++)
            {
                newData[i] = data[i];
            }
            data = newData;
        }

测试

我们来测试一下数组添加内容时的情况

代码语言:javascript
复制
 static void Main(string[] args)
        {
            Array<int> arr = new DataStructure.Array<int>(8);
            for (int i = 0; i < 8; i++)
            {
                arr.addLast(i);
            }
            Console.WriteLine(arr);
            arr.addLast(111);
            Console.WriteLine(arr.ToString());
            arr.addLast(222);
            Console.WriteLine(arr.ToString());
            Console.ReadKey();
        }
在这里插入图片描述
在这里插入图片描述

我们在初始时设置数组的容量为8,并为其添加8个数据。我们再次添加111,发现数组扩容了两倍,capacity=16,再次添加222,数组数据增加1,容量不变。符合我们设计的预期。

如果容量比较大,我们存的数据使用的空间少,将会造成资源的浪费,我们这时设置,当数组中数据的量小于容量的1/2时,将数组容量缩减一半

修改删除方法

代码语言:javascript
复制
 //删除指定索引位置的元素
        public E remove(int index)
        {
            if (index < 0 || index >= size)
                throw new ArgumentException("Get failed.Index is illegal");
            E ret = data[index];
            for (int i = index + 1; i < size; i++)
            {
                data[i - 1] = data[i];
            }
            size--;
            data[size] = default(E);
            //元素减少到容量的1/2时,数组容量减少一半
            if (size == data.Length / 2)
                resize(data.Length / 2);
            return ret;
        }

测试

代码语言:javascript
复制
static void Main(string[] args)
        {
            Array<int> arr = new DataStructure.Array<int>(15);
            for (int i = 0; i < 8; i++)
            {
                arr.addLast(i);
            }
            Console.WriteLine(arr);
            arr.removeLast();
            //arr.addLast(111);
            Console.WriteLine(arr.ToString());
            //arr.addLast(222);
            arr.removeLast();
            Console.WriteLine(arr.ToString());
            Console.ReadKey();
        }
在这里插入图片描述
在这里插入图片描述

测试结果符合预期

这样我们自己写的数组就基本完成了

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-04-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 修改添加方法
  • 添加扩容数组的方法
  • 测试
  • 修改删除方法
  • 测试
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com