目录
1.线性表
1.1 数组
数组:用一组地址连续的存储空间依次存储线性表的数据。
插入:O(n) ;
删除:O(n) ; 查找: 内容查找O(n) , 位置查找O(1)
多维数组:C++中的多维数组是行优先顺序表,逐行顺序存储。
缺点:改变长度困难,插入删除成本高。
int ar[5] = { 1,2,3,4,5 };
cout << ar[6] << endl;//没有数组越界判断
int arr[2][2] = { 0,1,2,3 };
cout << arr[-1][-1] << endl;//没有数组越界判断
vector<int> v = { 1,2,3,4,5 };
cout << v[6] << endl; //运行错误,超出vector的范围
1.2 链表
链表:既存储数据又存储相互连接信息的节点集合。
特点:可以动态的申请内存空间。
链表的类型:
- 单链表:链表节点只有节点数据data和指向后继节点的指针link。
插入:O(n), 删除:O(n) (操作本身是常数时间的,但是定位是O(n)的);
查找:内容查找O(n),位置查找O(n)。
template <class T>
class LinkNode
{
public:
T data;
LinkNode<T> *link;
LinkNode(const T& el, LinkNode<T> *ptr = 0)
{
data = el;
link = ptr;
}
};
- 双链表:
template<class T>
class DLLNode
{
public:
T data;
DLLNode<T> * prev;
DLLNode<T> * next;
DLLNode(const T&info,DLLNode<T> * prevVal=nullptr,DLLNode<T> * nextVal=nullptr)
:data(info),prev(prevVal),next(nextVal){}
};
//插入节点的步骤
//1.new一个节点空间
//2.初始化节点中的数据
//3.确定节点的前继和后继节点
//4.修改P的前继节点的后继链接,后继节点的前继链接
- 循环链表:将单链表的最后一个节点指向头结点,或者将双链表的头结点和尾节点链接起来。
1.3 栈-后进先出表
- 顺序栈:需要一块连续的存储单元来存储栈中的元素。需要事先给定或估计栈的大小,避免扩容开销
- 链式栈:简化的链表,栈顶元素设置为链表首节点,变量top设置为指向栈顶的指针。
- 栈与递归:大多数的程序设计语言的函数调用机制是由底层的编译栈支持的。
1.4 队列-先进先出表
- 顺序队列:通过取模运算实现一个逻辑上的循环队列。
- 链式队列:
1.5 字符串
KMP匹配算法: https://mp.youkuaiyun.com/postedit/88814376
1.6 线性表的应用
栈:简易计算器 (实现一下)
队列:银行叫号系统
字符串及链表:简易文本编辑器。