在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) : 向栈中插入一个元素,成功返回true
  • pop():从栈中弹出一个元素
  • Empty(): 检测栈是否为空
  • Full() : 检测栈是否已满
  • Destroy:销毁栈
typedef int DataElement;//用户自定义数据
//栈数据元素
typedef struct 
{
	DataElement *data;//用户自定义数据数组指针
	int         mTail;//尾部索引
	int         mSize;//数组大小
}ArrayStackElement;
//数组栈类
class ArrayStack
{
private:
       ArrayStackElement *myStackElement;//元素
public:
      //动态创建数组大小
      bool CreateStack(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;//栈数组大小
         return true;
    };

      //判断栈是否为空,空返回true
      bool Empty()
       {
          if(myStackElement == 0)//指针为空
            return false;
	    if(myStackElement->mTail == -1)//栈顶指针为-1,表示空
	        return true;
	   else 
	       return false;
     };

   //判断栈是否存满,满返回true
   bool Full()
   {
       if(myStackElement == 0)//指针为空
           return false;
	   if(myStackElement->mTail == myStackElement->mSize - 1) //栈顶+1 等于数组大小
	       return true;
	   else
	      return false;
   };

   //入栈操作
   bool Push(DataElement _data)
  {
      if(myStackElement == 0)//指针为空
         return false; 
      if(Full())//栈满 返回
	    return false;
	 else
	  {
	    myStackElement->mTail = myStackElement->mTail + 1;//栈顶指针加1
	    myStackElement->data[myStackElement->mTail] = _data;//输入存入栈顶
	 }
    return true;
 };

   //出栈操作
   DataElement Pop()
   {
      if(myStackElement == 0)//指针为空
         return 0; 
     if(Empty())//栈空
	   return 0;
	else
	 {
	    myStackElement->mTail = myStackElement->mTail - 1;//栈顶指针减1
	    return  myStackElement->data[myStackElement->mTail + 1];//弹出栈顶数据
	 }
  };

   //销毁栈
   bool Destroy()
  {
      if(myStackElement == 0)//指针为空
         return false; 
	 if(myStackElement->data != 0)
	    delete(myStackElement->data);//销毁内存
	 if(myStackElement != 0)
	    delete(myStackElement);//销毁内存   
	 return true;
  };   
};

示例如下
在这里插入图片描述

(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) : 向栈中插入一个元素,成功返回true
  • pop():从栈中弹出一个元素
  • Empty(): 检测栈是否为空
  • Full() : 检测栈是否已满
  • Destroy:销毁栈
  • Size():获得栈的元素个数

示例如下

PROGRAM PLC_PRG
VAR	
	t :ArrayStack;
END_VAR

VAR
	bInit :BOOL:= FALSE;
	isize : INT;
	ivar1: ARRAY[0..20] OF BaseElement;
END_VAR
IF 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[0] := t.Pop(); //返回33
ivar1[1] := t.Pop(); //返回22
ivar1[2] := t.Pop(); //返回11
ivar1[3] := t.Pop(); //返回0

END_IF

在这里插入图片描述

四、 Codesys代码下载

请添加图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值