先进先出算法------队列
一、意义目的
- 解决多个多个呼叫一个应答问题。
- 如何排队,如何出队。
- 常用于缓存多个请求,保持队列,先进先出。
- 好处是有顺序,但是可以结合实际,比如位置比较近要先出,可以将“先进先出”作为排队出队子算法,再去排序,达到效率最高。
二、原理:使用数组改变下标方式存入,出栈把后面变量一个一个往前移动覆盖。
- 采用触发存入方式,存入值不能等于0或与之前存入值相同,否则不能存入。“20”为堆栈个数可以采用变量。
- 入栈最后一个存入值为新值且满足入队条件,则如果触发会持续覆盖栈尾。所以入队的存入值需要固定,防止栈尾错乱。
- 出栈与入栈方式相同。往前移动。
三、代码
#TRIG[0](CLK := #入栈触发, Q => #入栈触发脉冲); IF #入栈触发脉冲 THEN; #相同标志 := FALSE; FOR #j := 0 TO 20 DO //堆栈数据判断,有重复不写入 IF #入栈值 <> 0 AND #入栈值 = #array[#j] THEN #相同标志 := TRUE; END_IF; END_FOR; #不重复存储:=NOT(#相同标志); #入栈触发 := FALSE; END_IF; IF #不重复存储 THEN; #array[#数组下标] := #入栈值; IF #数组下标 <= 20 THEN; #数组下标 := #数组下标 + 1;//会执行到21时,并且存入。所以需要20个,直接写值为19。 END_IF; #相同标志 := FALSE; #不重复存储 := FALSE; END_IF; #TRIG[1](CLK := #出栈触发, Q => #出栈触发脉冲); IF #出栈触发脉冲 THEN; #出栈值 := #array[0]; FOR #I := 0 TO #数组下标 DO IF #I <= 20 THEN #array[#I] := #array[#I + 1]; #array[#I + 1] := 0; END_IF; END_FOR; IF #数组下标 > 0 THEN #数组下标 := #数组下标 - 1; END_IF; #出栈触发 := FALSE; END_IF; IF #清除栈数据 THEN ; //清除栈数据 #array := #array空数组; #数组下标 := 0; #入栈值 := 0; #出栈值 := 0; #清除栈数据:=FALSE; #相同标志 := FALSE; #不重复存储 := FALSE; END_IF; #堆栈数据 := #array; #存储个数 := #数组下标;
四、还有一个金字塔呼叫
多个呼叫信号只响应最早的一个,用互锁实现,做完一个呼叫灭一个。但是不能缓存呼叫顺序,需要持续呼叫。