[西门子] 西门子SCL编程实例——栈的实现算法

[复制链接]
查看37387 | 回复0 | 2024-11-26 09:09:34 | 显示全部楼层 |阅读模式
栈也是一种数据结构,它的特点是数据后入先出(Last In First Out,LIFO)或者说是先入后出,意思是一样的。栈有三个基本动作:初始化、入栈和出栈。接下来给大家介绍下我使用SCL语言编写的栈函数FB5018_Stack_Real,它以不定长数组作为存储区,以实数作为数据类型,实现了栈的初始化、入栈和出栈的操作。

在博途环境下新建函数块FB5018_Stack_Real,声明变量如下:



其中:


    init:当该参数的值为真时,将栈初始化,内部上升沿信号处理;

    push:当该参数的值为真时,将数据data入栈,内部上升沿信号处理;

    pop:当该参数的值为真时,将数据出栈到dataQ,内部上升沿信号处理;

    data:要入栈的数据;

    done:操作完成(该信号会保持,当操作出错后会复位);

    error:操作出错;

    dataQ:从栈中出来的数据;

    counter:栈中数据的数量;

    errCode:错误代码(1=存储区满,3=存储区空);

    buffer:不定长数组,要操作的数据源;

    statStackPointer:栈指针(静态变量);

说明:由于初始化、入栈和出栈的动作均采用上升沿信号处理,为了便于观察,每次操作完成后done信号会保持,若操作出错后会复位。

由于代码比较长,我将其分区处理,如下面的图片所示:

//初始化



//栈信号判断



//数据处理



//输出



在使用前,先进行初始化,然后再进行数据入栈/出栈的操作。

这个函数块我已经测试过了,如果你有任何问题,欢迎留言。下面是我在OB1中的测试代码,使用之前介绍的随机数生成函数:




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则