先进先出算法

一、意义目的

  • 解决多个多个呼叫一个应答问题。
  • 如何排队,如何出队。
  • 常用于缓存多个请求,保持队列,先进先出。
  • 好处是有顺序,但是可以结合实际,比如位置比较近要先出,可以将“先进先出”作为排队出队子算法,再去排序,达到效率最高。

二、原理:使用数组改变下标方式存入,出栈把后面变量一个一个往前移动覆盖。

  • 采用触发存入方式,存入值不能等于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;
#存储个数 := #数组下标;
    

 四、还有一个金字塔呼叫

多个呼叫信号只响应最早的一个,用互锁实现,做完一个呼叫灭一个。但是不能缓存呼叫顺序,需要持续呼叫。

posted @ 2024-04-17 20:42  剑i  阅读(10)  评论(0编辑  收藏  举报