线性表是n个具有相同特征的数据元素的有序序列 ------ 人话:每个元素的类型都是一致的,并且有先后顺序 数据表其实也就是一个相对简单的数据结构
线性表的存储结构:可以分为2种,用顺序存储实现的线性表就是顺序存储,链式存储
顺序存储:逻辑上相邻的元素,在内存中也存放在相邻的位置。实际上,线性表的顺序存储就是用数组来实现的
顺序表的实现方式:静态和动态。 动态的实现 通过new和delete来申请和释放空间。静态实现:直接创建一个足够大的数组,来充当顺序表。静态分配是直接向内存申请一大块连续的区域,动态是按需所取,合理的申请大小空间
创建:
const int N = 1e6 + 10; 根据实际情况而定
int a[N]; 用足够大的数组来模拟顺序表
int n; 标记顺序表里面有多少个元素
int main()
{
return 0;
}
添加一个元素:分为3种 尾插:在顺序表的后面插入一个新元素
头插:在顺序表的前面插入一个新元素
任意位置插入:在位置p处插入一个元素
const int N = 1e6 + 10;
int a[N];
int n;
void print()
{
for(int i = 1; i <= n; i++)
{
cout << a[i] << " ";
}
cout << endl << endl;
}
void push_back(int x) 尾插
{
a[++n] = x;
}
void push_front(int x) 头插
{
for(int i = n; i >= 1; i--)
{
a[i + 1] = a[i];
}
a[1] = x;
n++;
}
void insert(int x,int p) 任意位置插入
{
for(int i = n; i >= p; i--)
{
a[i + 1] = a[i];
}
a[p] = x;
n++;
}
int main()
{
push_back(2);
print();
push_back(5);
print();
push_back(1);
print();
push_back(3);
print();
return 0;
}
删除一个元素的操作:尾删、头删、任意删
void pop_back() 尾删
{
n--;
}
void pop_front(int x) 头删
{
for(int i= 2; i <= n; i++)
{
a[i - 1] = a[i];
}
n--;
}
void erase(int p) 任意位置删
{
for(int i = p + 1; i <= n; i++)
{
a[i - 1] = a[i];
}
n--;
}
查找元素:
//按值查找
int find(int x)
{
for(int i = 1; i <= n; i++)
{
if(a[i] == x)
return i;
}
return 0;
}
//按位查找 返回顺序表中第p位的元素
int at(int p)
{
return a[p];
}
修改元素
void change(int p, int x)
{
a[p] = x;
}
清空顺序表
void clear()
{
n = 0;
}
封装静态顺序表
vector的介绍 需要头文件为 #include<vector>
vector<int>a1; <> 里面放我要放的类型 创建一个名字为a1的可变长数组 里面都是int类型的数据
vector<int>a2(N); 创建一个大小为10的可变长数组,里面的值都初始化为0
vector<int>a3(N,2); 创建一个大小为10的可变长数组,里面的值都初始化为2
vector<int>a4 = {1,2,3,4,5};初始化列表的创建方式
vector<vector<int>> a5; 创建一个二维的可变长数组
vector<string> a6; 存字符串
vector<node> a7; 存结构体
vector<int> a8[N]; 创建了一个大小为N的vector数组
size 返回实际元素个数
void print(vector<int>&a)
{
for(int i = 0; i < a.size(); i++)
{
cout << a[i] << " ";
}
cout << endl;
}
empty 返回顺序表是否为空,因此是一个bool类型的返回值
if(a1.empty()) cout << "空" << endl;
else cout << "不空" << endl;
begin 返回起始位置的迭代器(左闭)
end 返回终点位置的下一个位置的迭代器(右开)
push_back:尾部添加一个元素
pop_back:尾部删除一个元素
当然还有insert 与 erase 不过由于时间复杂度过高,尽量不使用
front 返回首元素
back 返回尾元素
resize:修改vector的大小。如果大于原始大小,多出来的位置会补上默认值,一般是0。如果小于原始大小,相当于把后面的元素全部删掉
vector<int>aa(5,1);
print(aa);
aa.resize(10);
print(aa);
aa.size(3);
print(aa);
clear:清空vector
vector<int>aa(5,1);
cout << aa.size() << endl;
aa.clear();
cout << aa.size() << endl;
pair 用于将两个值组合成一个单一的对象,通常用于存储值对应或返回多个值,它有两个公有成员 first 和 second ,分别表示第一个值和第二个值
pair<第一个关键字的类型,第二个关键字的类型> pair<int,int>p1;
一般使用pair的时候会进行 typedef