一、 栈定义
栈是一种后进先出(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;
if (Empty())
{
pTail = pTemp;
}
else
{
pTemp->Pre = pTail;
pTail = pTemp;
}
return true;
}
DataElement pop()
{
DataElement mdata = 0;
if (Empty())
return mdata ;
if (pTail->Pre== 0)
{
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);
t.Push(22);
t.Push(33);
isize := t.Size();
ivar1[0] := t.Pop();
ivar1[1] := t.Pop();
END_IF
四、 Codesys代码下载
|