数据结构-复习(一):线性表

目录

1.线性表

1.1 数组

1.2 链表

1.3 栈-后进先出表

1.4 队列-先进先出表

1.5 字符串

1.6 线性表的应用


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 线性表的应用

栈:简易计算器 (实现一下)

队列:银行叫号系统

字符串及链表:简易文本编辑器。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值