一、 栈定义
栈是一种后进先出(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