08.栈(二)栈的应用

一、栈的应用-递归

1.递归函数:把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称为递归函数。

2.栈与递归

递归函数实际是一个前行和退回的过程,相当与入栈、出栈。在前行阶段,对于每一层递归,函数的局部变量、参数值以及返回地址都被压入栈中。在退回阶段,位于栈顶的局部变量、参数值和返回地址被弹出(出栈),用于返回调用层次中执行代码的其余部分,也就是恢复了调用的状态。

3.递归应用-斐波那契数列

斐波那契数列描述的是兔子的繁殖问题,这个数列有个十分明显的特点:前面相邻两项之和,构成了后一项。

其数学模型为:

| 0,当n=0时,其中n为月个数

F(n)=| 1,当n=1时

|F(n-1)+F(n-2),当n>1。其中n为经历的月个数,F(n)为第n个月时兔子的数量。

递归实现源码:

/*斐波那契的递归函数
*实现打印前40位斐波那契数列
    */
int Fb(int i)    //i为第i个月
{
    if(i<2)
        return i==0?0:1;            //当n=0、n=1时情况,该月返回的兔子总数=0/1
    return Fb(i-1)+Fb(n-2);    //当n>1时,第i个月返回的兔子总数
}
int main()
{
    int i;
    for(int i=0;i<40;i++)    //依次计算并打印前40个月兔子的数量
    {
          printf("%d",Fb(i));
    }
    return 0;
}

二、栈的应用-四则运算表达式求值

1.中缀表达式转换为后缀表达式

(1)目标:中缀表达式"9+(3-1)*3+10/2"转化为后缀表达式"9 3 1 - 3 * + 10 2 / +"

(2)规则:从左到右遍历中缀表达式的每个数字和符号。若是数字就输出,若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于栈顶符号,则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。

2.后缀表达式计算结果

(1)目标:计算后缀表达式"9 3 1 - 3 * + 10 2 / +"

(2)规则:从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,就将处于栈顶两个数字出栈,进行运算,再将运算结果进栈,一直得到最终结果。

总结:

将中缀表达式转换为后缀表达式关键在于-栈用来进出运算的符号

将后缀表达式进行运算的得出结果关键在于-栈用来进出运算的数字。

时间: 2024-12-18 16:13:01

08.栈(二)栈的应用的相关文章

数据结构与算法系列研究二——栈和队列

栈和队列的相关问题分析 一.栈和队列定义 栈和队列是两种重要的数据结构.从结构特性角度看,栈和队列也是线性表,其特殊性在于它们的基本操作是线性表的子集,是操作受限的线性表,可称为限定性的数据结构:从数据类型角度看,其操作规则与线性表大不相同,是完全不同于线性表的抽象数据类型.                    图1 栈的结构                                                 图2 队列的结构   1.1.栈是限定在表的一端进行插入和删除操作的线性

数据结构实验之栈二:一般算术表达式转换成后缀式

数据结构实验之栈二:一般算术表达式转换成后缀式 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之. 输入 输入一个算术表达式,以'#'字符作为结束标志. 输出 输出该表达式转换所得到的后缀式. 示例输入 a*b+(c-d/e)*f# 示例输出 ab*cde/-f*+ 提示 来源 示例程序 由一般是求后缀式: 1.设立暂时存放运算符的栈: 2.设表达式的结束符为"#

栈1--出栈序列

栈1--出栈序列 一.心得 二.题目及分析 进栈序列是123,求所有的出栈序列 用回溯法做 三.代码及结果 1 #include <iostream> 2 #include <stack> 3 using namespace std; 4 5 stack<int> sta; 6 int ans[4]; 7 int total=0; 8 9 void print(){ 10 total++; 11 cout<<total<<": &quo

07.栈(一)栈的存储结构及操作

一.栈 1.栈(stack):是限定仅在表尾进行插入和删除操作的线性表.其中,允许插入和删除的一端被称为栈顶(top),另一端被称为栈底(bottom),不含任何数据元素的栈被称为空栈.栈又被称为后进先出(Last In First Out)的线性表,简称LIFO结构. 栈的插入操作为进栈,栈的删除操作为出栈. 2.栈的抽象数据类型 ADT 栈(stack) Data 同线性表.元素具有相同类型,相邻元素具有前驱和后继关系. Operation InitStack(*S):初始化操作,建立一个空

数据结构初探(一)栈与栈的应用

(一)在描述栈(stack)之前,我们先了解一下数据结构基础概念: 1.数据(data)是对客观事物的符号表示,数据元素(data element)是数据的基本单位,一个数据元素可由若干个数据项(data item)组成,数据项为数据的不可分割的最小单位,数据对象(data object)是性质相同的数据元素的集合,是数据的一个子集.数据结构(data structure)是相互之间存在一种或多种特定关系的数据元素的集合.数据元素相互之间的关系称为结构(structure). 2.根据数据元素之

C++中栈的出栈,入栈规则:A,B,C,D,E

考题: 栈底至栈顶一次存放元素 ABCD 在第五个元素E入栈之前  栈中元素可以出栈,则出栈序列可能是_____a d___________. a.  ABCED b.  DBCEA   c.  CDABE   d.  DCBEA 分析: 1.假定进栈序列是从小到大排练的(即A<B<C<D<E),则出栈序列中不可能有  “大小中”这种序列,因为在“大数”出栈后,在栈中“中数”是在“小数”上面的,所以只能是先出“中数”再出“小数”2.出栈序列中如包含下列序列则是错误的:CAB,DAB

压栈出栈遍历栈实例代码

#include<stdio.h> #include<stdlib.h> #include<malloc.h> typedef struct Node//定义一个链表结构体 { int data; struct Node* pNext; }NODE,*PNODE; typedef struct Stack//定义一个栈结构体 { PNODE pTop; PNODE pBottom; }STACK,*PSTACK; void initStack(PSTACK); void

栈及栈的链式存储结构(栈链)

栈:线性结构,后进先出.栈(Stack)是一种特殊的线性表(顺序表,链表)只在表尾进行删除和插入操作. 注意:对于栈来说,表尾称为栈的栈顶(top),表头称为栈底(bottom). 栈也是线性结构的一种特例.与队列不同,他只有一个口,只能从这里读或者写数据,这个口称为栈顶(top).栈是一种先进后出的数据结构.先进来的元素会放入栈底,而后进来的元素被放在它的上面,最后进来的元素的上面的位置,称为栈顶. 栈所提供的操作比一般的线性表要少很多,只提供:初始化.销毁.判断是否为空.求栈的长度.清空栈.

栈及栈的C++实现

栈:栈是一种数据结构,栈里元素的添加和删除只能在栈的末端进行.它是一种“后进先出”(LIFO)的数据结构. 栈的操作: initializeStack:初始化栈,使得为一个空栈. destroyStack:清空栈里所有的元素,使得为一个空栈. isEmptyStack:判断栈是否为空,如果为空,返回true,否则返回false. isFullStack  : 判断栈是否溢出,如果溢出,返回true,否则返回false. push : 添加一个新的元素到栈顶.前提是栈存在,且栈没有溢出. top