来源:互联网 发布:华大基因 知乎 编辑:程序博客网 时间:2024/06/13 12:55
栈的定义:
一种特殊的表,限制插入和删除只能在一个位置上进行的表。

栈的性质:
LIFO,last in first out

栈常用的操作:
创建栈(creat)
销毁栈(distory)
清空栈(clear)
进栈(push)
出栈(pop)
获取栈顶元素(Top)
获取栈的大小(get_length)

栈的实现:
  •数组实现
  •单链表实现
尽可能地利用代码复用的思想去实现。

使用链表的思想去实现栈,需要注意的地方。
  栈顶点的定义,包含了栈的长度。与其他节点不同
  销毁栈时,应该把栈节点占的内存注销掉,以免内存泄露。  


栈的应用

平衡符号:检验一份程序中的右括号都有其对应的左括号。
相应算法思路:
从第一个字符开始扫描,遇到普通字符忽略,当遇到左括号时压入栈中,但遇到右括号时从栈中弹出栈顶符号进行匹配
    匹配成功:继续读入下一个字符
    匹配失败:立即停止,并报错
成功:所有字符扫描完毕,且栈为空
失败:匹配失败 或 所有字符扫描完毕但栈非空。

注:合适的位置添加调试打印语句。


栈与递归

函数调用即是栈的一种应用。
在进行函数调用的时候,需要存储的所有重要的信息,例如寄存器的值、参数的值、局部变量的值、返回地址等,这些储存信息的工作都是由栈完成的。而这些存储的信息称为活动记录或者栈帧。
                       图:活动记录

当前计算机中栈常常是从内存分区的高端向下递增,即栈顶在低地址,栈底在高地址。而大多数系统中是不检测溢出的。所以我们在编写程序时应该避免栈溢出。通常造成栈溢出的原因通常有以下三点:
a)递归过深
b)分配的局部数组太大
c)失控递归(忘记了递归的基准情形)

补充:
关于使用递归的四项基本法则:
1、基准情形。必须总有些基准情形,无须递归就能解出。
2、不断推进,对于那些需要递归求解的情形,每一次递归调用都必须要使求解状况朝基准情形的方向前进
3、设计法则,假设所有的递归调用都能运行
4、合成效益法则

关于合成效应法则:
运用递归求Fibonacci数列:
long int fib(int n){    if(n <= 1)   //1        return 1;  //2    else        return fib(n-1) + fib(n-2); //3}


这个地方使用递归式不合适的(从运行效率上来讲),因为该程序做了大量多余的工作。在第三行上的第一次调用即 fib(n-1)实际上也计算了 fib(n-2),但是程序抛弃了这个信息,在它后面的调用fib(n-2)进行了重复的计算。抛弃的信息量递归的合成起来并导致巨大的运行时间。
以上或许是格言“计算任何事情不要超过一次”的最好实例。


对于递归的联想运用:词典查字。
不认识的字-->查-->解释中有不认识的字-->查-->解释的字全部认识。

0 0
原创粉丝点击