在Codesys用ST语言基于数组实现栈LIFO数据结构详细说明+代码实例-CODESYS资源下载区-酷德网 - CoDeSys软件教程下载,CoDeSys工控资讯门户 

酷德网

HSC6490-cn中国制造,中国芯~
查看: 1642|回复: 0

在Codesys用ST语言基于数组实现栈LIFO数据结构详细说明+代码实例

[复制链接]
  • TA的每日心情
    开心
    2017-11-20 22:07
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2023-4-12 22:08:40 | 显示全部楼层 |阅读模式
    一、 栈定义

    栈是一种后进先出(LIFO——last in first out)线性表,它只允许在表的后端(tail)进行插入(push)和删除(pop)操作。

    在Codesys用ST语言基于数组实现栈LIFO数据结构详细说明+代码实例-1.jpg


    在Codesys用ST语言基于数组实现栈LIFO数据结构详细说明+代码实例-2.gif


    二、栈实现

    实现栈,我们可以使用动态数组以及指向栈顶的索引
    在顺序栈中设定一个随时指向栈顶元素的索引变量tail,当 tail 的值为 -1 时,为“空栈”;数据元素进栈,tail 就加 1 ;数据元素出栈, tail 就减 1;

    在Codesys用ST语言基于数组实现栈LIFO数据结构详细说明+代码实例-3.png

    例如我们分配一个最长长度为7的数组,我们最多只能添加7个元素,在第7次元素"7"入栈后,因为栈已满,栈不在接受更多的入栈请求;
    三、 栈设计

    我们分别采用c++和codesys中st语言进行实现基于链表的栈操作
    (1) C++ 语言实现

    功能如下
      Create(k):构造器,动态创建K大小的数组Push(value) : 向栈中插入一个元素,成功返回truepop():从栈中弹出一个元素Empty(): 检测栈是否为空Full() : 检测栈是否已满Destroy:销毁栈
    1. typedefint DataElement;//用户自定义数据//栈数据元素typedefstruct{
    2.         DataElement *data;//用户自定义数据数组指针int         mTail;//尾部索引int         mSize;//数组大小}ArrayStackElement;//数组栈类classArrayStack{private:
    3.        ArrayStackElement *myStackElement;//元素public://动态创建数组大小boolCreateStack(int k){//如果栈已经存在,销毁if(myStackElement !=0)Destroy();//开辟内存
    4.          myStackElement =(ArrayStackElement *)malloc(sizeof(ArrayStackElement));
    5.          myStackElement->data =(DataElement*)malloc(sizeof(DataElement)* k);
    6.          myStackElement->mTail =-1;//栈顶初始值-1,为空
    7.          myStackElement->mSize =  k;//栈数组大小returntrue;};//判断栈是否为空,空返回trueboolEmpty(){if(myStackElement ==0)//指针为空returnfalse;if(myStackElement->mTail ==-1)//栈顶指针为-1,表示空returntrue;elsereturnfalse;};//判断栈是否存满,满返回trueboolFull(){if(myStackElement ==0)//指针为空returnfalse;if(myStackElement->mTail == myStackElement->mSize -1)//栈顶+1 等于数组大小returntrue;elsereturnfalse;};//入栈操作boolPush(DataElement _data){if(myStackElement ==0)//指针为空returnfalse;if(Full())//栈满 返回returnfalse;else{
    8.             myStackElement->mTail = myStackElement->mTail +1;//栈顶指针加1
    9.             myStackElement->data[myStackElement->mTail]= _data;//输入存入栈顶}returntrue;};//出栈操作
    10.    DataElement Pop(){if(myStackElement ==0)//指针为空return0;if(Empty())//栈空return0;else{
    11.             myStackElement->mTail = myStackElement->mTail -1;//栈顶指针减1return  myStackElement->data[myStackElement->mTail +1];//弹出栈顶数据}};//销毁栈boolDestroy(){if(myStackElement ==0)//指针为空returnfalse;if(myStackElement->data !=0)delete(myStackElement->data);//销毁内存if(myStackElement !=0)delete(myStackElement);//销毁内存   returntrue;};};
    复制代码
    示例如下

    在Codesys用ST语言基于数组实现栈LIFO数据结构详细说明+代码实例-4.jpg


    (2) Codesys 实现

      编程软件: Codesys V3.5 SP17运行设备:PC电脑编程语言: ST ,掌握如何创建动态数组 之New的使用
    定义结构体
    1. //栈操作的数据
    2. TYPE ArrayStackElement :
    3. STRUCT
    4.         pData : POINTER TO BaseElement;
    5.         mTail : INT;
    6.         mSize : INT;
    7. END_STRUCT
    8. END_TYPE
    复制代码
    其中 BaseElement 是一个别名,其定义如下,这里BaseElement 是用户自定义数据(比如结构体),采用别名是方便替换。
    1. TYPE BaseElement : INT; END_TYPE
    复制代码
    定义功能块(FUNCTION_BLOCK): ArrayStack,实现如下函数
      Create(k):构造器,动态创建K大小的数组Push(value) : 向栈中插入一个元素,成功返回truepop():从栈中弹出一个元素Empty(): 检测栈是否为空Full() : 检测栈是否已满Destroy:销毁栈Size():获得栈的元素个数
    示例如下
    1. PROGRAM PLC_PRG
    2. VAR       
    3.         t :ArrayStack;
    4. END_VAR
    5. VAR
    6.         bInit :BOOL:= FALSE;
    7.         isize : INT;
    8.         ivar1: ARRAY[0..20] OF BaseElement;
    9. END_VAR
    复制代码
    1. IF bInit = FALSE THEN
    2.        
    3. bInit := TRUE;
    4. t.Create(4);//动态创建栈内数组大小
    5. t.Push(11);//入栈 ,返回TRUE
    6. t.Push(22);//入栈 ,返回TRUE
    7. t.Push(33);//入栈 ,返回TRUE
    8. isize := t.Size();//返回4
    9. ivar1[0]:= t.Pop();//返回33
    10. ivar1[1]:= t.Pop();//返回22
    11. ivar1[2]:= t.Pop();//返回11
    12. ivar1[3]:= t.Pop();//返回0
    13. END_IF
    复制代码
    在Codesys用ST语言基于数组实现栈LIFO数据结构详细说明+代码实例-5.jpg


    四、 Codesys代码下载
    +10
    不赞一个?
    打赏鼓励一下!
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

    本版积分规则

    
    顶部qrcode底部
    关注酷德网订阅号,获取更多资讯!

    QQ|Archiver|手机版|小黑屋|酷德论坛 ( 苏ICP备16065247号-1 )|网站地图

    GMT+8, 2026-11-9 03:46 , Processed in 0.159016 second(s), 49 queries .

    酷德网

    © 2001-2013 Hicodesys. 技术支持 by 酷德网

    快速回复 返回顶部 返回列表