![5cd65b87059f76f94dad696eb4a5fbb3.png](https://img-blog.csdnimg.cn/img_convert/5cd65b87059f76f94dad696eb4a5fbb3.png)
一、数组
数组(Array)是一种线性表数据结构。数组用一块连续的内存空间,来存储相同类型的一组数据,最大的特点就是支持随机访问,但插入、删除操作也因此变得比较低效,平均情况时间复杂度为 O(n)。
二、链表
链表通过指针将一组零散的内存块串联在一起。其中,内存块称为链表的“结点”。
![e22e7b701a4aa1dc6a700ff859664a2e.png](https://img-blog.csdnimg.cn/img_convert/e22e7b701a4aa1dc6a700ff859664a2e.png)
![3ae438f48fc89cadd4598dcf17d93390.png](https://img-blog.csdnimg.cn/img_convert/3ae438f48fc89cadd4598dcf17d93390.png)
三、栈
后进者先出,先进者后出,这就是典型的“栈”结构。栈主要包含两个操作,入栈和出栈,也就是在栈顶插入一个数据和从栈顶删除一个数据。实际上,栈既可以用数组来实现,也可以用链表来实现。
栈在函数调用中的应用
操作系统给每个线程分配了一块独立的内存空间,这块内存被组织成“栈”这种结构,用来存储函数调用时的临时变量。每进入一个函数,就会将临时变量作为一个栈帧入栈,当被调用函数执行完成,返回之后,将这个函数对应的栈帧出栈。
栈在表达式求值中的应用
编译器就是通过两个栈来实现的。其中一个保存操作数的栈,另一个是保存运算符的栈。从左向右遍历表达式,当遇到数字,就直接压入操作数栈;当遇到运算符,就与运算符栈的栈顶元素进行比较。如果比运算符栈顶元素的优先级高,就将当前运算符压入栈;如果比运算符栈顶元素的优先级低或者相同,从运算符栈中取栈顶运算符,从操作数栈的栈顶取 2 个操作数,然后进行计算,再把计算完的结果压入操作数栈,继续比较。
![4e0f8aa979c56f699315cb98350aa36f.png](https://img-blog.csdnimg.cn/img_convert/4e0f8aa979c56f699315cb98350aa36f.png)
四、队列
先进者先出,这就是典型的“队列“结构。队列主要包含两个操作,入队和出队。队列可以用数组来实现,也可以用链表来实现。
阻塞队列和并发队列
![v2-129158a1a866b5df2b3bf83e77f0c05c_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=018a1a9c-403b-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-129158a1a866b5df2b3bf83e77f0c05c_b.jpg)
![e31b56c37c3dc115bca7a396de1640bf.gif](https://img-blog.csdnimg.cn/img_convert/e31b56c37c3dc115bca7a396de1640bf.gif)
![5dc0ff020de5f273611d5a96740c139b.png](https://img-blog.csdnimg.cn/img_convert/5dc0ff020de5f273611d5a96740c139b.png)