数据结构-数组

 代码

#include <iostream>
using namespace std;
#include<ctime>
//#include<stdlib.h>

//数组实现
class Array
{public:
	Array(int size = 10):m_Cur(0), m_Cap(10)
	{
		m_pArr = new int[m_Cap];
	}
	~Array()
	{
		delete m_pArr;//释放堆上的内存
		m_pArr = nullptr;//栈上的指针指向空
	}

public:
	//末尾增加元素
	void push_back(int val)
	{
		if (m_Cur == m_Cap)
		{
			expand(2 * m_Cap);
		}
		m_pArr[m_Cur] = val;
		m_Cur++;
	}
	//末尾删除元素
	void pop_back()
	{
		if (m_Cur == 0)
		{
			return;
		}
		m_Cur--;
	}
	//按位置增加元素
	void insert(int pos, int val)
	{
		if (pos<0 || pos>m_Cur)
		{
			return;
		}
		if (m_Cur == m_Cap)
		{
			expand(2 * m_Cap);
		}
		//移动元素
		for (int i = m_Cur - 1; i >= pos; i--)//从末尾开始
		{
			m_pArr[i+1] = m_pArr[i];
		}
		m_pArr[pos] = val;
		m_Cur++;
	}
	//按位置删除元素
	void erase(int pos)
	{
		//判断参数有效性
		if (pos < 0 || pos >= m_Cur)
		{
			return;
		}
		for (int i = pos + 1; i < m_Cur; i++)
		{
			m_pArr[i-1] = m_pArr[i];
		}
		m_Cur--;
	}
	//按元素查询
	int find(int val)
	{
		for (int i = 0; i < m_Cur; i++)
		{
			if (m_pArr[i] == val)
			{
				return i;
			}
		}
		return -1;
	}
	//打印数据
	void show()const
	{
		for (int i = 0; i < m_Cur; i++)
		{
			cout << m_pArr[i] << " ";
		}
		cout << endl;
	}
private:
	//内部数组扩容接口
	void expand(int size)
	{
		int* p = new int[size];
		memcpy(p, m_pArr, sizeof(int) * m_Cap);
		delete m_pArr;
		m_pArr = p;
		m_Cap = size;
	}

private:
	int* m_pArr;//指向可扩容的数组内存
	int m_Cap;//数组的容量
	int m_Cur;//有效元素个数
};



int main()
{
	Array arr;

	srand(time(0));
	for (int i = 0; i < 10; i++)
	{
		arr.push_back(rand() % 100);
	}
	arr.show();
	arr.pop_back();
	arr.show();
	arr.insert(0, 100);
	arr.show();
	arr.insert(9, 200);
	arr.show();
	int pos = arr.find(100);
	if (pos != -1)
	{
		cout << "找到了" << endl;
		arr.erase(pos);
		arr.show();
	}
}

元素逆序问题(双指针)

整型数组

#include <iostream>
using namespace std;
#include<string.h>


//元素逆序问题
void reverse(int arr[], int size)//(数组名即首地址)
{
	int* p = arr;
	int* q = arr + size - 1;// 参考p++  ;等价于  *(arr+size-1) ;arr[0]等价于 *(arr+0)
	while (p < q)
	{
		int ans = *p;
		*p = *q;
		*q = ans;
		p++, q--;
	}
}


int main()
{
	int arr[] = { 1,25,98,6,26,2,8 };
	int len = sizeof(arr) / sizeof(int);
	for (int v:arr)
	{
		cout << v << " ";
	}
	cout << endl;
	reverse(arr, len);
	for (int v : arr)
	{
		cout << v << " ";
	}

	return 0;
}

字符数组

#include <iostream>
using namespace std;
#include<string.h>


//元素逆序问题
void reverse(char arr[], int size)//(数组名即首地址)
{
	char* p =arr;          
	char* q =arr+size-1;// 参考p++  ;等价于  *(arr+size-1) ;arr[0]等价于 *(arr+0)
	while (p<q)
	{
		char ans = *p;
		*p = *q;
		*q = ans;
		p++, q--;
	}
}


int main()
{
	char arr[] = "hello world";
	cout << arr << endl;

	reverse(arr,strlen(arr));
	cout << arr << endl;

	return 0;
}

字符串(注意地址传递)

#include <iostream>
using namespace std;
#include<string.h>


//元素逆序问题
void reverse(char arr[], int size)
{
	char* p =arr;          
	char* q =arr+size-1;// 参考p++  ;等价于  *(arr+size-1) ;arr[0]等价于 *(arr+0)
	while (p<q)
	{
		char ans = *p;
		*p = *q;
		*q = ans;
		p++, q--;
	}
}


int main()
{
	char arr[] = "hello world";
	cout << arr << endl;

	reverse(arr,strlen(arr));
	cout << arr << endl;

	return 0;
}

奇偶数调整问题

#include <iostream>
using namespace std;
#include<string.h>


//整型数组,偶数到左边,奇数到右边
void AdjustArray(int arr[],int len)
{
	int* p = arr;
	int* q = arr + len - 1;
	while (p < q)
	{
		//找到左边的奇数
		if ((*p & 0x1) == 0)//*p是偶数  0x1是16进制的1
		{
			p++;
			continue;
		}

		//找到右边的偶数
		if ((*q & 0x1) == 1)//同为1
		{
			q--;
			continue;
		}
		//p->奇数,q->偶数      交换
		int temp = *p;
		*p = *q;
		*q = temp;
		p++, q--;
	}

}


int main()
{
	int arr[10] = { 0 };
	srand(time(0));
	for (int i = 0; i < 10; i++)
	{
		arr[i] = rand() % 20;
	}
	for (int v : arr)
	{
		cout << v << " ";
	}
	cout << endl;

	AdjustArray(arr, 10);
	for (int v : arr)
	{
		cout << v << " ";
	}
	cout << endl;

	return 0;
}
#include <iostream>
using namespace std;
#include<string.h>

//0x1是一个十六进制数,表示十进制的1。在计算机编程中,
//十六进制数通常用于表示二进制数的简写形式,其中每个十六进制位对应4个二进制位。
//因此,0x1实际上等于二进制数的 0001。


//整型数组,偶数到左边,奇数到右边
void AdjustArray(int arr[],int len)
{
	int* p = arr;
	int* q = arr + len - 1;
	while (p < q)
	{
		//找到左边的奇数
		while (p<q)
		{
			if ((*p & 0x1) == 1)//*p是偶数  0x1是16进制的1
			{
				break;
			}
			p++;
		}
		

		//找到右边的偶数
		while (p < q)
		{
			if ((*q & 0x1) == 0)//同为1
			{
				break;
			}
			q--;
		}
		
		//p->奇数,q->偶数      交换
		while (p<q)
		{
			int temp = *p;
			*p = *q;
			*q = temp;
			p++, q--;
		}
	}
		

}


int main()
{
	int arr[10] = { 0 };
	srand(time(0));
	for (int i = 0; i < 10; i++)
	{
		arr[i] = rand() % 20;
	}
	for (int v : arr)
	{
		cout << v << " ";
	}
	cout << endl;

	AdjustArray(arr, 10);
	for (int v : arr)
	{
		cout << v << " ";
	}
	cout << endl;

	return 0;
}

移除元素

#include <iostream>
using namespace std;
#include<string.h>



int removeElement(int* arr, int size, int val)
{
	int* p = arr;
	int* q = arr + size - 1;
	while (p<=q)
	{
		if (*q == val)
		{
			q--;
			continue;
		}
		if (*p == val)
		{
			*p = *q;
			q--;
		}
		p++;
	}
	return p - arr;
}



int main()
{
	int arr[10] = { 0 };
	for (int i = 0; i < 10; i++)
	{
		arr[i] = i;
	}
	for (int v : arr)
	{
		cout << v << " ";
	}
	cout << endl;

	int ans= removeElement(arr, 10, 3);
	cout << ans << "   ";
	for (int i=0;i<ans;i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值