数据结构——队列和栈

队列(类似与银行排队办业务)
eg:
当任务时两个任务运行速率不一样时采用队列(缓冲区)比如数据采集端和数据处理端
插入叫做入队操作,删除叫做出队操作特性:先进先出(First In First Out)
满足先进先出的特性只能进行头删和尾插 
有关链式队列的操作
(标签节点定义三个变量1.pFront(指向队头)2.pRear(指向队尾)3.cLen(节点长度)) 
1.创建一个队列 
2.入队 
3.出队 
4.清空 
5.判空 
6.获取队头元素 
7.销毁 线程邮箱:采用链表加队列的形式多线程通信时采用全局变量和信号是不安全的思路:将每一个线程任务都放在链表节点里面,通过链表链接起来 
每个线程都有自己的ID通过遍历链表找到线程(ID或名称) 
!但目的线程可能需要处理多个任务(别的线程)所以用到队列顺序队列(数组(连续的)) 
顺序队列的特性:!假溢出: 
当进行不断的入队和出队时pRear会指向外部空间 但内部队列还有可以入队的空间 
解决假溢出可以使用循环队列循环队列所存在的问题: 当指向队头和指向队尾相同时队列不仅可以是满的也可以是空的
解决:为了区分满和空放弃一个少入队的空间(数据量为len-1) 
pFront = pRear 空队列 
pRear+1 = pFront 满队列 
所以队列的空间为前闭后开[pFront,pRear)
!入队时pFront不断往后移走到最后空间再往后则越界,所以需要回到首位回到首位的表达式:(pFront+1) % len 
有关循环队列的操作!!代码是重点 
1.创建队列:!创建时不仅申请标签的空间,还有整个(循环队列)数组的空间 
2.入队(防止越界(pFront+1) % len) 
3.出队(如果要得到数据,则传入数据首地址) 4.清空 
5.判空和判满 
6.获取队头元素 
7.销毁 
8.遍历(遍历时不能移动pFront和pRear)

栈(Stack)链式栈特性:先进后出(类似于弹夹上子弹或者是一个封死的容器,只允许一端插入删除)
允许插入的操作:入栈/压栈
删除数据的操作:出栈/弹栈
在链表中链表头方便操作,所以叫栈顶 
有关栈的操作: 
1.创建 
2.入栈(头插)push 
3.出栈(头删)pop 
4.获取栈顶元素 
5.清空栈 
6.销毁栈
系统栈区不仅存储局部变量,还有函数的形参,返回值 以及动态存储函数的调用关系(因为函数调用调用时有一个压栈和出栈的过程) 在主函数中调用函数而调用完时需要回来进行下一步操作所以需要保存现场(保存该函数的下一条指令的地址到栈区) 在函数结束后再从栈区将地址拿出(恢复现场)
栈所分的结构: 
满增栈
满减栈 
空增栈
空减栈 
满栈和空栈的区别:
栈顶所在位置是否存有元素 
增栈和减栈的区别:入栈数据时内存增长方向不同 
满栈:先移动栈顶再入栈 
空栈:先往栈顶所在元素入栈,再移动栈顶(达到新的栈顶时没有数据) 
增栈:栈顶在入栈数据时由内存低地址向内存高地址移动(出栈就从高向低) 
减栈:栈顶在入栈数据时由内存高地址向内存低地址移动(出栈就由低向高)
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

seven——seven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值