【学习笔记----数据结构06-栈的应用】
2016-04-08 17:48
435 查看
栈的应用
栈的引入简化了程序设计的问题,划分了不同关注层次,使得思考范围缩小,更回聚集于我们要解决的问题核心。反之像数组等,因为要分散精力去考虑数组的下标增减等细节问题,反而掩盖了问题的本质栈的应用—-递归
定义:把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称做递归函数。每个递归定义必须至少有一个条件,满足时递归不再进行,即不再引用自身而是返回值退出。迭代和递归的区别是:迭代使用的是循环结构,递归使用的是选择结构。结构清晰、更简洁、更容易让人理解,从而减少读懂代码的时间。但是大量的递归调用会建立函数的副本,会耗费大量的时间和内存。迭代则不需要反复调用函数和占用额外的内存。因此我们应该视不同的情况选择不同的代码实现方式。
递归过程的退回的顺序是它前行顺序的逆序。在退回过程中,可能要执行某些动作,包括恢复在前行过种存储起来的某些数据。这种存储某些数据,并在后面又以存储的逆序恢复这些数据,以提供之后使用的需求,显然很符合栈这样的数据结构。
简单地说,就是在前行阶段,对于每一层递归,函数的局部变量,参数值以及返回地址都被压入栈中。在退回阶段,位于栈顶的局部变量、参数值和返回地址被弹出,用于返回调用层次中执行代码的其余部分,也就是恢复调用的状态。高级语言中这个都由系统代劳。
一种不需要括号的后缀表达法,我们也把它称为逆波兰表示。
如:9+(3-1)×3+10÷2,如果要用后缀表示法应该是什么样子:”931-3*+102/+”,这样的表达式称为后缀表达式,即所有的符号都是在要运算的数字的后面出现。
规则:从左到右遍历表达式的每个数字和符号,遇到数字进栈,遇到是符号,就将处于栈顶的两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果。
”931-3*+102/+”是怎么写出来的?
中缀表达式转后缀表达式
我们把平时所用的标准四则运算表达式,即9+(3-1)×3+10÷2叫做中缀表达式。
931-3*+102/+叫后缀表达式。中缀到后缀规则:
从左到右遍历中缀表达的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或优先级不高于栈顶符号(乘除优先加减)则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。
从刚才的推导中你会发现,要想让计算机具有处理我们通常的标准表达式的能力,最重要的就是两步:
将中缀表达式转化为后缀表达式(栈用来进出运算符号)
将后缀表达式进行运算得出结果(栈用来进出运算的数字)
相关文章推荐
- 数据结构-堆
- 【学习笔记----数据结构05-栈与队列】
- 【学习笔记----数据结构04-单循环链表】
- 位运算-Number of 1 Bits(求一个十进制数字,它的二进制表示中有多少个 1(bit))
- 【学习笔记----数据结构03--线性链表】
- 数组分段查找
- 栈-Min Stack(实现一个栈,用常数级时间找出栈中的最小值)
- 【学习笔记----数据结构01-概述】
- hdu 1506(dp || 单调栈)
- 常用数据结构及类
- HashMap源码注解 之 内部数据结构 Node (三)
- 1、Linux驱动重要的数据结构
- 数据结构学习(1)
- 【学习笔记----数据结构02--线性表】
- SDUT 2116----数据结构实验之链表一:顺序建立链表
- 数据结构与算法——AVL树类的C++实现
- mysql 中decimal数据结构
- 二叉树遍历总结
- 算法与数据结构 - 二叉树
- 【AC自动机】【数据结构】【树】【Aho-Corasick automation】AC自动机理解(入门)