数据结构笔记总结(栈与队列)
栈与队列
栈
定义
栈是限定仅在表尾进行插入和删除操作的线性表
个人翻译:看过弹夹吗,他只会在装弹口进行装弹和弹出操作,这就是栈
允许插入删除操作的一端为栈顶,另一端为栈底
栈的插入操作称为入栈
栈的删除操作称为出栈
不含任何任何数据元素的栈称为 空栈
特性
栈最显著的特性就是先进后出
栈的分类
顺序栈
可以使用线性表的顺序存储结构(即数组)实现栈,将之称之为顺序栈
所有顺序存储的结构都有一个很致命的问题就是需要事先确定一个固定的长度,固定长度所导致的问题就是内存空间的浪费或是内存的溢出
同样的他们也都有一个优势就是存取定位非常方便
链式栈
可以使用单链表实现栈,称之为链式栈
所有链式存储的结构也都有一个很致命的问题就是在每一个数据节点中都需要增加一个指针域,这会增加内存的开销,但好处是栈的长度一般来说是无限的
时间复杂度
由于插入操作皆是在队尾进行,所以当有一个指针一直指在队尾时无论是顺序表还是链式表时间复杂度都为O(1)
栈的应用
四则运算
方法:
一、首先通过栈将中缀表达式转化为后缀表达式
规则:
-
数字直接加入后缀表达式
-
如果是‘(’, 入栈
-
如果是‘)’, 则依次把栈中的运算符加入后缀表达式,直到出现‘(’并从栈中删除它
-
如果是运算符 + - * /
a.栈空或者栈顶元素为‘(’, 入栈
b.高于栈顶元素优先级,入栈
c.否则依次弹出栈顶运算符,直到遇到一个优先级小于它的运算符或者是遇到‘(’为止
-
遍历完成后,如果栈非空则依次弹出所有栈顶元素加入到表达式当中
二、通过栈得到运算结果
从左到右,遇到运算符就弹出相应的运算数,运算后再把结果入栈.最终结果就是栈顶数的值.
队列
定义
队列是允许在一端进行插入操作,而在另一端进行删除操作的线性表。
允许删除的一端称为队头
允许插入的一端称为队尾
特性
队列是先进先出
队列分类
顺序队列
链式队列
循环队列
顺序队列会造成一个问题,就是假溢出,队头元素出栈后,并不能像顺序表一样,将剩下的元素集体往前面移一个地址,就会造成,队列前面明明有大量的空间未被使用但是元素排到队尾造成假溢出,为了解决这个问题就引入了循环链表的概念。
定义
将头尾相接的顺序存储结构称为循环队列
当头尾相接时虽然解决了假溢出的问题,但是同样也产生了一个问题,无法判断队列是否已满。
判断队列是否已满的方法
第一种
设置一个标志变量,当front==rear,且flag=0时为队列空
当front==rear,且flag=1时为队列满
第二种
当队列空时,front==rear,当队列满时,我们修改它的条件,保留一个元素空间。也就是说,队列满是,数组中还有一个空闲单元。
所以循环队列求队伍长度(rear-front+maxsize)%maxsize通过这个公式也可判定队列是否满了