在讲解堆栈的作用之前先捋一捋概念。
程序=数据结构+算法(瑞典计算机科学家,Niklaus Wirth)------>数据结构是计算机系统中数据的组织形式和相会关系----------->数据结构包括数据逻辑结构、数据存储结构、数据操作集合----------->数据逻辑结构包括线性结构和非线性结构----------->栈是一种特殊的线性结构的数据逻辑结构。
栈形式上又分为顺序栈和链栈。不管是什么栈他都要满足只能从一端进行数据的插入和删除。就好比一口#后放进去的东西可以先去出来,栈的特点是先进去后出来,这也是栈存在的根本。
占有五种基本运算,可以通过五个函数去实现。setnull(stack);empty(stack);push(stack);pop(stack);top(stack);分别是使栈为空、判断栈是否为空、压栈、弹栈、取栈顶元素。
概念性的说完了,下面我们要知道他有什么用!这才是重点。
栈结构最典型的应用是程序设计中子程序的调用与返回的断点和现场数据的处理。
例如:
fun3()
{
语句5;
}
fun2()
{
语句3;
fun3();
语句4;
}
fun1()
{
语句1;
fun2();
语句2;
}
示例代码中定义了三个函数,fun1,fun2,fun3。
在执行fun1的时候pc指针指导了fun2,这是cpu将根据fun2的地址内容执行相应的操作,在执行fun2的时候又遇到了fun3,同样cpu会执行fun3,但是fun3执行完了呢,pc指针总不能还在执行自加操作跑到为指定区域了吧!堆栈粉墨登场了!
当执行fun1的时候,pc指向fun2时在进入fun2之前编译器就会自动建立堆栈把语句2的地址执行压栈操作,同理一次把语句4也执行压栈操作,这样箱子里就有存货2只了!
最上面的是语句4的地址,下面的是语句2的地址。
当执行完fun3,从堆栈里弹出一个地址给pc指针,pc执行了语句4,fun2执行完了,pc在弹栈,pc就指向了语句2,cpu顺序执行下面的内容。这样问题解决了!
堆栈在处理递归算法也是非常有效的,思想都是一样的——先进后出!这才是栈存在的根本。
参考资料:http://zh.wikipedia.org/wiki/堆栈
http://baike.baidu.com/view/93201.htm
黄迪明 《软件技术基础》