一、意义目的
- 解决多个多个呼叫一个应答问题。
- 如何排队,如何出队。
- 常用于缓存多个请求,保持队列,先进先出。
- 好处是有顺序,但是可以结合实际,比如位置比较近要先出,可以将“先进先出”作为排队出队子算法,再去排序,达到效率最高。
二、原理:使用数组改变下标方式存入,出栈把后面变量一个一个往前移动覆盖。
- 采用触发存入方式,存入值不能等于0或与之前存入值相同,否则不能存入。“20”为堆栈个数可以采用变量。
- 入栈最后一个存入值为新值且满足入队条件,则如果触发会持续覆盖栈尾。所以入队的存入值需要固定,防止栈尾错乱。
- 出栈与入栈方式相同。往前移动。
#TRIG[0](CLK := #入栈触发, Q => #入栈触发脉冲); IF #入栈触发脉冲 THEN; #相同标志 := FALSE; FOR #i1 := 0 TO 20 DO //堆栈数据判断,有重复不写入 IF #入栈值 <> 0 AND #入栈值 = #array[#i1] THEN #相同标志 := TRUE; END_IF; END_FOR; #不重复存储:=NOT(#相同标志); #入栈触发 := FALSE; END_IF; IF #不重复存储 THEN; #array[#指针] := #入栈值; IF #指针 <= 20 THEN; #指针 := #指针 + 1; 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; #存储个数 := #指针;
标签:触发,END,入栈,算法,FALSE,array,先进先出,指针 From: https://www.cnblogs.com/nycgood/p/18141750