一、意义目的
- 解决多个多个呼叫一个应答问题。
- 如何排队,如何出队。
- 常用于缓存多个请求,保持队列,先进先出。
- 好处是有顺序,但是可以结合实际,比如位置比较近要先出,可以将"先进先出"作为排队出队子算法,再去排序,达到效率最高。
二、原理:使用数组改变下标方式存入,出栈把后面变量一个一个往前移动覆盖。
- 采用触发存入方式,存入值不能等于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;
#存储个数 := #数组下标;
四、还有一个金字塔呼叫
多个呼叫信号只响应最早的一个,用互锁实现,做完一个呼叫灭一个。但是不能缓存呼叫顺序,需要持续呼叫。