代码
#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;
}