【恋上数据结构与算法】学习笔记-动态数组(C++)

2020.12.18 学习笔记,未完待续。
即将硕士毕业从事C++开发人员,修炼内功,欢迎纠错与讨论。


一、什么是数据结构?

数据结构是计算机存储、组织数据的方式
在这里插入图片描述

二、线性表

线性表是具有n个相同类型元素有限序列(n ≥ 0)
在这里插入图片描述

  • a1是首结点(首元素),an是尾结点(首元素)
  • a1是a2的前驱,a2是a1的后继

常用的线性表有:

  • 数组
  • 链表
  • 队列
  • 哈希表(散列表)

三、数组(Array)

数组是一种顺序存储的线性表,所有元素的内存地址是连续

int *array = new int[3]{ 11, 22, 33 };

在这里插入图片描述
在很多编程语言中,数组都有个致命的缺点:

  • 无法动态修改容量

四、动态数组(Dynamic Array)

1、动态数组接口设计

动态数组一般需要下面的这些接口。
代码如下:

	template<class T>
	...
	int size(); //元素的数量
	bool isEmpty(); //是否为空
	bool contains(T element); //是否包含某个元素
	void pushBack(T element); //尾端添加元素
	T at(int index); //返回index位置对应的元素
	T set(int index, T element); //设置index位置的元素
	void add(int index, T element); //往index位置添加元素
	T remove(int index); //删除index位置对应的元素
	int indexOf(T element); //查看元素的位置
	void clear(); //清楚所有元素
	...

2、构造函数与析构函数

无参构造调用有参构造,如果构造动态数组的空间小于默认空间,则以默认空间构造动态数组。
代码如下:

template<class T>
MyArray<T>::MyArray():MyArray(DEFAULT_CAPACITY){}

template<class T>
MyArray<T>::MyArray(int capacity)
{
	mSize = 0;
	mCapacity = (capacity > DEFAULT_CAPACITY) ? capacity : DEFAULT_CAPACITY;
	mElements = new int[mCapacity];
}

template<class T>
MyArray<T>::~MyArray()
{
	delete[] mElements;
	mElements = nullptr;
}

3、元素数量

template<class T>
int MyArray<T>::size()
{
	return mSize;
} 

4、是否为空

如果mSize==0,则数组为空。

template<class T>
bool MyArray<T>::isEmpty()
{
	return mSize == 0;
}

5、根据索引查看元素

首先索引检查,索引越界抛出索引。

template<class T>
void MyArray<T>::checkIndex(int index) 
{
	if (index < 0 || index >= mSize)
		throw index;
}

然后,根据索引查看数组元素。

template<class T>
T  MyArray<T>::at(int index)
{
	checkIndex(index);
	return mElements[index];
}

6、设置元素

检查索引,替换索引位置的元素。

template<class T>
T MyArray<T>::set(int index, T element)
{
	checkIndex(index);
	mElements[index] = element;
	return element; 
}

7、查看元素位置

遍历数组,找到元素返回位置;
找不到返回-1(ELEMENT_NOT_FOUND)

template<class T>
int MyArray<T>::indexOf(T element)
{
	for (int i = 0; i < mSize; i++)
	{
		if (element[i] == element)
			return i;
		else
			return ELEMENT_NOT_FOUND;
	}
}

8、包含元素

根据查看元素位置,如果包含则不等于-1.

template<class T>
bool MyArray<T>::contains(T element)
{
	return indexOf(element) != ELEMENT_NOT_FOUND;
}

9、清除所有元素

设置mSize = 0

template<class T>
void MyArray<T>::clear()
{
	mSize = 0;
}

10、打印数组-重载<<

//类外实现 输出流<<重载
template<class T>
ostream& operator<<(ostream& arrcout, MyArray<T>& arr)
{
	for (int i = 0;i<arr.size();i++)
	{
		arrcout << arr.at(i) << " ";
	}		
	return arrcout;
}

11、删除元素

从前往后,向前覆盖
在这里插入图片描述

template<class T>
T MyArray<T>::remove(int index)
{
	checkIndex(index);
	int old = mElements[index];
	for (int i = index; i < mSize; i++)
	{
		mElements[index] = mElements[index+1];
	}
	mSize--;
	return old;
}

12、添加元素

从后往前覆盖
在这里插入图片描述

template<class T>
void MyArray<T>::add(int index, T element)
{
	if (index < 0 || index > mSize)
		throw index;

	for (int i = mSize - 1; i >= index; i--)
	{
		mElements[i + 1] = mElements[i];
	}
	mElements[index] = element;
	mSize++;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值