无心飞扬 发表于 2023-4-12 22:08:40

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

一、 栈定义

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





二、栈实现

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


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

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

功能如下
Create(k):构造器,动态创建K大小的数组Push(value) : 向栈中插入一个元素,成功返回truepop():从栈中弹出一个元素Empty(): 检测栈是否为空Full() : 检测栈是否已满Destroy:销毁栈
typedefint DataElement;//用户自定义数据//栈数据元素typedefstruct{
        DataElement *data;//用户自定义数据数组指针int         mTail;//尾部索引int         mSize;//数组大小}ArrayStackElement;//数组栈类classArrayStack{private:
       ArrayStackElement *myStackElement;//元素public://动态创建数组大小boolCreateStack(int k){//如果栈已经存在,销毁if(myStackElement !=0)Destroy();//开辟内存
         myStackElement =(ArrayStackElement *)malloc(sizeof(ArrayStackElement));
         myStackElement->data =(DataElement*)malloc(sizeof(DataElement)* k);
         myStackElement->mTail =-1;//栈顶初始值-1,为空
         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{
          myStackElement->mTail = myStackElement->mTail +1;//栈顶指针加1
          myStackElement->data= _data;//输入存入栈顶}returntrue;};//出栈操作
   DataElement Pop(){if(myStackElement ==0)//指针为空return0;if(Empty())//栈空return0;else{
          myStackElement->mTail = myStackElement->mTail -1;//栈顶指针减1returnmyStackElement->data;//弹出栈顶数据}};//销毁栈boolDestroy(){if(myStackElement ==0)//指针为空returnfalse;if(myStackElement->data !=0)delete(myStackElement->data);//销毁内存if(myStackElement !=0)delete(myStackElement);//销毁内存   returntrue;};};示例如下



(2) Codesys 实现

编程软件: Codesys V3.5 SP17运行设备:PC电脑编程语言: ST ,掌握如何创建动态数组 之New的使用
定义结构体
//栈操作的数据
TYPE ArrayStackElement :
STRUCT
        pData : POINTER TO BaseElement;
        mTail : INT;
        mSize : INT;
END_STRUCT
END_TYPE


其中 BaseElement 是一个别名,其定义如下,这里BaseElement 是用户自定义数据(比如结构体),采用别名是方便替换。
TYPE BaseElement : INT; END_TYPE定义功能块(FUNCTION_BLOCK): ArrayStack,实现如下函数
Create(k):构造器,动态创建K大小的数组Push(value) : 向栈中插入一个元素,成功返回truepop():从栈中弹出一个元素Empty(): 检测栈是否为空Full() : 检测栈是否已满Destroy:销毁栈Size():获得栈的元素个数
示例如下
PROGRAM PLC_PRG
VAR       
        t :ArrayStack;
END_VAR

VAR
        bInit :BOOL:= FALSE;
        isize : INT;
        ivar1: ARRAY OF BaseElement;
END_VARIF bInit = FALSE THEN
       
bInit := TRUE;

t.Create(4);//动态创建栈内数组大小
t.Push(11);//入栈 ,返回TRUE
t.Push(22);//入栈 ,返回TRUE
t.Push(33);//入栈 ,返回TRUE
isize := t.Size();//返回4
ivar1:= t.Pop();//返回33
ivar1:= t.Pop();//返回22
ivar1:= t.Pop();//返回11
ivar1:= t.Pop();//返回0

END_IF

四、 Codesys代码下载
页: [1]
查看完整版本: 在Codesys用ST语言基于数组实现栈LIFO数据结构详细说明+代码实例