栈和队列: 都属于特殊的线性结构
栈:特殊的线性表,只有一个出入口,只能在其一端进行数据的插入和删除
特性:后进先出 出入数据都在栈顶
可以看作只能进行尾插尾删的线性表
底层选择链式空间还是连续空间?
顺序表只要不在头部和中间进行增删,就不需要进行数据的搬移,那么效率就非常高,并且顺序结构的实现相对简单 ,只需要在尾部操作,时间为O(1),当然链式结构也是可以,把节点挂起来,但是一个个小结点的效率没有连续空间那么高
应用:进行单链表的逆向打印,不用库里提供的函数,尽量用静态栈,用宏确定大小,因为动态栈稍微复杂,还要考虑增容 没有特殊说明要存放多少个元素时要用动态的,静态栈实现起来快,并说明静态栈的缺点
队列:只允许在一端进行插入 插入端为队尾,在另一端进行删除 叫队头
-
顺序结构
-
只能头删,和尾删
-
出队列,保持队头不动 O(N)
-
出队列,队头向后移动 空间浪费 假溢出 优点:O(1)时间就能解决
-
假溢出:有空间没有用,但back走到了末尾没有能力再存数据了,相当于队列长度被压缩了,解决:放入环形队列,让front指针重新走到队头
-
环形队列不是真的环形的内存空间,它是想象出来的,只是让back向后走转到了头部
-
-
真溢出:所有位置已经把元素存满没有位置了,就算是真溢出
-
-
-
环形队列当队列满的时候,与队列空的时候,都是队头与队尾重合,如何区分是个问题,而且要判断有没有指针越界问题,连续空间不适合用于有头删操作的问题
-
少用一个存储空间,当存到队头前一个停止
-
-
-
if(rear+1)%N)==fronnt) 满
-
-
-
-
-
-
定义flag;入队列:flag=1; 出队列: flag=0
-
push-->rear--front-->1
-
rear==front &&flag=1 队列满
-
-
pop-->front-->rear-->flag=0
-
rear==front && flag==0 队列空
-
-
-
计数方式:count -->入队列:count++
-
-
出队列:count --
2.链式结构
队头在链表头,队尾在链表尾