素材来自
目录
一、数据结构
数据:数据是信息的载体,是计算机的处理对象
数据可分为:数值型数据(如:正数),和非数值型数据(如:字符)两种
数据的基本单位称为数据元素(如:数组元素,树结点)
结构:是指数据元素之间的关系
数据结构:包括逻辑结构和物理结构两部分
逻辑结构:是数据结构抽象出来的数学模型
物理结构(也称:存储结构):是数据结构在计算机中的表示
存储结构有顺序存储和链式存储两种
集合:数据元素之间除了“同属一个集合”之外,没有其他关系。
1.逻辑结构
线性结构:一个对一个的关系,比如线性表、栈、队列
树形结构:一对多的关系
图形结构:多对多的关系
1.线性表
特点:
(1)均匀性:同一线性表内各个数据元素的类型是一致的。
(2)有序性:除了第一个元素和最后一个元素外,每个数据元素只有唯一的直接前趋、唯一的直接后继(第一个元素无前趋,最后一个元素无后继),各元素之间是一对一的关系。
数组:
数组是在内存中一段连续的存储空间,可以在常数时间内访问任意位置的元素
但是数组也有缺点,无法做到快速的插入和删除,因为空间是连续且固定的,想要在p位置插入/删 除一个元素,则p之后的位置的元素都需要移动。 为了能够在常数时间内实现元素的插入和删除,我们引入链表这种数据结构
链表:
链表的两个结点之间一般通过一个指针来从一个结点指向另一个结点,因 此链表的结点一般由两部分构成,即数据域和指针域。
列表操作:
要实现一个链表,需要支持以下几种操作:
插入数据:可以在其中任意位置插入数据
删除数据:可以删除任意数据
查看数据:只能从head开始向后find每个数据
获取链表大小:获取链表内数据个数
STL库中的列表操作:
list<数据类型>名;定义链表:
例如:list<int>L;
size()获取链表中的数据个数 .
empty()判断链表是否为空 .
clear()清空整个链表 .
push_back(x)在链表末尾插入数据 .
push_front(x)在链表开头插入数据 .
insert(it,x)在it的位置之前插入数据x,it是一个迭代器
.remove(x)删除链表中所有的x
erase(it)删除迭代器i指向的数据,并返回被删除元素的下一个位置的迭 代器
栈(Stack):
是限制在一端进行插入和删除操作的线性数据结构
后进先出LIFO(Last In First Out)
先进后出FILO(irst In Last Out)
◆栈顶(Top):允许进行插入、删除操作的一端, 又称为表尾。用栈顶指针(top)来代替栈顶元素。
◆空栈:当表中没有元素时称为空栈。
栈有两种操作:
1、插入元素(入栈)I
2、删除元素(出栈) 注意这两种操作只能在栈顶进行。下面的图倒过来看就是123三个元素按顺序入栈。也能发现一 些元素按顺序入栈,然后再一个一个地出栈,这些元素的顺序会反过来。
要实现一个栈,需要支持以下几种操作:
1、插入数据:只能在“栈顶”插入数据
2、删除数据:只能删除“栈顶”数据
3、查看栈顶元素:获取“栈顶”数据
4、栈的大小: 获取栈内数据个数
定义一个栈: stack<数据类型>栈名;
例如:stack<int>S;
插入数据: S.push(x)
弹出栈顶: S.pop()
取出栈顶: S.top()
二、表达式
1.定义
前缀表达式
把运算符放在操作数前面的表达方式
中缀表达式
把运算符放在操作数之间的表达方式
后缀表达式
把运算符放在操作数后面的表达方式
2.中缀表达式
中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间。
中缀表达式是人们常用的算术表达式方法。
a+b*c+(d*e+f)*g的中缀表达式:a+b*c+(d*e+f)*g
对计算机来说中缀表达式却很复杂。因此计算机表达式的值时,通常需要先将中缀表达式转 换为前缀或者后缀表达式,然后再进行求值。对计算机来说,计算前缀或后缀表达式的值非 常的简单。
3.前缀表达式
前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前
例如:- + 1 x +2 3 4 5
如上面这个例子中的前级表达式对应着中缀表达式1+(2+3)*4-5 。
前缀表达式的计算机求值
1.从右至左扫描表达式
2.调到数字时,将数字入栈
3.遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素op次顶元素),并将结果入栈 重复上述过程直到表达式最左端,
4.最后运算得出的值即为表达式的结果 。
4.后缀表达式
后缀表达式又称逆波兰式,后缀表达式的运算符位于操作数之后
例如:34+5x6-
上面这个例子中的后缀表达式对应着中缀表达式(3+4)*5-6 6
后缀表达式的计算机求值 。
1.从右至左扫描表达式
2.调到数字时,将数字入栈
3.遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素op次顶元素),并将结果入栈 重复上述过程直到表达式最左端,
4.最后运算得出的值即为表达式的结果 。
5.中缀表达式转化为前缀/后缀表达式
(1)括号法
以a+b*c+(d*e+f)*g为例
1.按照运算符的优先级对所有的运算单位加括号
式子变成:((a+(b*c)) +(((d*e)+f)*g))
2.转换前缀与后缀表达式
前缀:把运算符号移动到对应的括号前面 则变成:+(+(a*(bc)*(+(*(de)f)g)) 把括号去掉:++a*bc*+*defg前缀表达式出现
后缀:把运算符号移动到对应的括号后面 则变成:((a(bc)*)+(((de)*f)+g)*)+把括号去掉:abc*+de*f+g*+后缀表达式出现