栈是数据结构中最常见的一种类型之一,其存储数据的方式为“先进后出”。即在时间轴前端压入的数据会被放置到存储柱的底部,并随时间后移将数据依次往上堆放;反之,弹出时,先出栈的为置于存储柱顶端的数据,后依次往下弹出。这样一来,本次弹出的数据总为上一次压入的数据,一压一弹的对称操作,可以达到”局部时间反演“的作用,固其也就成为了完成”现场保护与恢复“的最佳工具。
从数据传输端口来说,入口与出口为同一个且唯一,即与外界交互的接口只有一个,避免了外界直接从数据串中部(或其他地方)访问,牺牲端口数量以最大化存储的安全性,保证了数据的不变与有序。因此,在多线程的环境中,为了保证线程同步,对端口操作加锁是十分必要的。
从其结构体(c语言)来说,常见的有数据串指针型、链表型等:
typedef struct Stack //指针型
{
datatype * data; //指向存储的数据(可用malloc申请)
int top; //当前栈顶的下标
int max; //当前可存储的最大数量
}stack;
typedef struct Note //链表型 { struct Note *next; ITYPE data; }note;
typedef struct List { note *head; }list;
关于栈的基本操作函数有:
Init_Stack(); //初始化栈
Extend_Stack(); //拓展栈
Judge_Empty(); //判空(当前已存入数量)
Push_Stack(); //压入数据
Pop_Stack(); //弹出数据
Top_Stack(); //取栈顶(不弹出)
Clear_Stack(); //清空栈
在实际应用层面,栈往往处理“当前数据或即时操作仅与上一个记录的数据有关”的问题(类马尔科夫?)。例如:寻找迷宫路径(记录来时的方向)、表达式的计算(记录上一个数字及运算符)等等。