IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 在Codesys基于链表实现栈LIFO数据结构详细说明+代码实例 -> 正文阅读

[数据结构与算法]在Codesys基于链表实现栈LIFO数据结构详细说明+代码实例

一、 栈定义

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

请添加图片描述

二、栈实现

实现栈,我们可以使用单向链表(逆向),链表中的每个结点不仅包含值,还包含链接到上一个结点的引用字段。通过这种方式,单链表将所有结点按顺序组织起来。蓝色箭头显示单个链接列表中的结点是如何组合在一起的
在这里插入图片描述

三、 栈设计

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

(1) C++ 语言实现

功能如下

  • Push(value) : 向栈顶插入一个元素,成功返回true
  • pop():获得栈顶元素并弹出
  • Empty(): 判断栈是否为空,为空返回true
  • Size():获得栈的元素个数
typedef int DataElement;//用户自定义的数据

typedef struct StackElement//栈元素
{
    DataElement  mdata;//用户自定义的数据
    StackElement* Pre;//指向下一个节点
 }StackElement;
 
//通过链表实现队列
class ListStack
{
public:
    ListStack() {};
    ~ListStack() {};
private:
   
    StackElement* pTail = 0;//栈尾指针
public:
bool push(DataElement _data) 
    {
     // 申请一个结点空间
        StackElement* pTemp = (StackElement*)malloc(sizeof(StackElement));
         pTemp->mdata = _data;// 申请一个结点空间
         pTemp->Pre= 0;// 结点的next设为NULL
          if (Empty()) // 判断栈尾是否为空,用于第一次入队
          {
             pTail = pTemp; 
          }
          else
         {
          pTemp->Pre = pTail;// 让pTail成为当前尾部的上一结点
           pTail = pTemp;// 尾部指针指向pTemp
         }
         return true;
     }
     DataElement pop() 
    {
    DataElement  mdata = 0;
        if (Empty())
            return mdata ;
        if (pTail->Pre== 0)// 判断栈是否就1个,如果只有一个 ,移除后队列为空 
        {
           delete(pTail);//清除移除的内存空前
            pTail = 0;  
        }
        else
        {
          StackElement* pTemp = pTail;
         pTail = pTail->Pre;//移动头部指针
          delete(pTemp);//清除移除的内存空前
        }
        return true;
    };

     //返回节点个数
     int Size()
     {
         int iSize  = 0;
         StackElement* pTemp = pTail;
         while (pTemp != 0)
          {
             iSize = iSize + 1;
             pTemp = pTemp->Pre;
          }
        return iSize;
     }
     //判断栈是否为空
     bool Empty()
     {
       if (pTail == 0)
          return true;
       else
         return false;
     }
}

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

(2) Codesys 实现

  • 编程软件: Codesys V3.5 SP17
  • 运行设备:PC电脑
  • 编程语言: ST

定义结构体

//栈操作的数据
TYPE ListStackElement :
STRUCT
	mData : BaseElement;
	pPre : POINTER TO ListStackElement;
END_STRUCT
END_TYPE


其中 BaseElement 是一个别名,其定义如下,这里BaseElement 是用户自定义数据(比如结构体),采用别名是方便替换。

TYPE BaseElement : INT; END_TYPE

定义功能块(FUNCTION_BLOCK): ListQueue,实现如下函数

  • Push(value) : 向栈顶插入一个元素,成功返回true
  • pop():获得栈顶元素并弹出
  • Empty(): 判断栈是否为空,为空返回true
  • Size():获得栈的元素个数

示例如下

PROGRAM PLC_PRG
VAR
	t  : ListStack;
END_VAR

VAR
	bInit :BOOL:= FALSE;
	isize : INT;
	ivar1: ARRAY[0..10] OF BaseElement;
END_VAR
IF bInit = FALSE THEN 
	
bInit := TRUE;

t.Push(11);//入栈 ,返回TRUE
t.Push(22);//入栈 ,返回TRUE
t.Push(33);//入栈 ,返回TRUE
isize := t.Size();//返回3
ivar1[0] := t.Pop(); //返回33
ivar1[1] := t.Pop(); //返回22

END_IF

在这里插入图片描述

四、 Codesys代码下载

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-11 22:26:29  更:2022-03-11 22:27:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 15:00:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码