数据-第18课-栈与递归

第18课-栈与递归

C语言中的疑惑

讨论中……

小A:C语言中常说“局部变量在栈上分配空间”,那么这个地方的“栈”和我们之前学习的栈数据结构有关系吗?

小B:我觉得应该没关系吧 :我觉得应该没关系吧,只是名称碰巧一致而已吧?!

1. 函数调用时的栈

(1)程序中的“函数调用栈”是栈数据结构的一种应用。

(2)函数调用栈一般是从高地址向低地址增长的。

l  栈底为内存的高地址处。

l  栈顶为内存的低地址处。

(3)函数调用栈中存储的数据为活动记录

2. 活动记录

活动记录是函数调用时一系列相关信息的记录。

3. 函数调用过程

4. 程序中的栈

(1)      程序中的栈空间可看做一个顺序栈的应用。

(2)      栈保存了一个函数调用所需的维护信息。

(3)      函数参数,函数返回地址 ,函数返回地址。

l  局部变量。

l  函数调用上下文。

5. 栈的溢出

(1)      在不断的压栈过程中造成栈空间耗尽而产生栈溢出。

(2)      栈溢出常由于函数递归过深或局部数组过大造成。

#include <stdio.h>

void reverse(char* s)

{

if( (s != NULL) && (*s != ‘\0‘) )

{

reverse(s + 1);

printf("%c", *s);

}

}

int main()

{

reverse("12345");

printf("\n");

return 0;

}

运行结果:54321

分析:第一次的递归*s指向的是1,之后一次是2,3,4,5。这些结果一次进栈。这些的递归是以reverse(s + 1);为界限的,当所有的文件递归结束后,再让我们之前指向的数据依次出栈。所以我们看到的最后结果是54321。我们这里要明白一点,那就是递归函数是要进栈的。

小结

(1)程序栈空间在本质上是一种顺序栈。

(2)程序栈空间的访问是通过函数调用进行的。

(3)程序栈空间仍然遵从后进先出的规则。

原文地址:https://www.cnblogs.com/free-1122/p/11322800.html

时间: 2024-11-06 11:00:35

数据-第18课-栈与递归的相关文章

数据-第17课-栈课后练习

第17课-栈课后练习 1. 分析顺序栈和链式栈各个操作的算法时间复杂度. 2. 我们在创建顺序栈时将队尾定义为栈顶,而在创建链式栈时将队头定义为栈顶.那么我们反过来可行吗(即:顺序栈操作队头,链式栈操作队尾)?为什么? 3. 将后缀表达式的转换和计算合并为一个完整的程序,当用户输入合法的s四则运算表达式时直接给出结果. 提示: l  示例中只能处理每个数字为0—9的情况,如何扩展? l  如何判断表达式的输入是否合法? 原文地址:https://www.cnblogs.com/free-1122

数据-第16课-栈的应用实战二

第16课-栈的应用实战二 1. 问题的提出 计算机的本质工作就是数学运算,那计算机可以读入字符串”9 + (3 - 1) *5 +8/2”并且计算值吗? 2. 后缀表达式 波兰科学家在20世纪50年代提出了一种将运算符放在数字后面的后缀表达式. 对应的,我们平时用的数学表达式叫做中缀表达式. 实例 5 + 3 => 5 3 + 1 + 2 * 3 => 1 2 3 * + 9 + ( 3–1 ) * 5 => 9 3 1–5 * + 中缀表达式符合人类的阅读和思维习惯:后缀表达式符合计算

第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据

第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据 ADO.NET 为什么要学习? 我们要搭建一个平台(Web/Winform)让用户方便的操作数据库中的数据. 什么是ADO.NET 是一组库类,System.Data. Ado.net组成 Connection:用来连接数据库 Command:用来执行SQL语句 DataReader:只读.只进的结果集,一条一条读取数据(SteamReader.XmlReader) Da

深度优先搜索入门:POJ1164城堡问题(递归、用栈模拟递归)

将问题的各状态之间的转移关系描述为一个图,则深度优先搜索遍历整个图的框架为:Dfs(v) {if( v 访问过)return;将v标记为访问过;对和v相邻的每个点u: Dfs(u);}int main() {while(在图中能找到未访问过的点 k) Dfs(k);} 例题: POJ1164 The Castle Description 1 2 3 4 5 6 7 ############################# 1 # | # | # | | # #####---#####---#-

java栈和递归的关系

最近看了Mark.Allen.Weiss的算法与数据结构,看到了里面讲述的表.栈和和队列,结合最近工程用的比较多的递归运算.所以这里讲一下递归 因为在年初的时候看了<大话数据结果>(推荐看一下),这里先讲一下概念:函数的递归调用和普通函数调用是一样的,当程序执行到某个函数时,将这个函数进行入栈操作,入栈之前主要做三件事 1.把入参,返回地址等返回给被调用函数保存 2.分配栈空间 3.准备被调用 出栈也一样: 1.保存运算结果 2.消除栈空间 3.把运算结果放到栈空间出口 所以递归这种存储某些数

算法9---二叉树的遍历不用栈和递归

二叉树的遍历不用栈和递归 转自:ACM之家 http://www.acmerblog.com/inorder-tree-traversal-without-recursion-and-without-stack-5988.html 我们知道,在深度搜索遍历的过程中,之所以要用递归或者是用非递归的栈方式,参考二叉树非递归中序遍历,都是因为其他的方式没法记录当前节点的parent,而如果在每个节点的结构里面加个parent 分量显然是不现实的,那么Morris是怎么解决这一问题的呢?好吧,他用得很巧

Spark IMF传奇行动第18课:RDD持久化、广播、累加器总结

昨晚听了王家林老师的Spark IMF传奇行动第18课:RDD持久化.广播.累加器,作业是unpersist试验,阅读累加器源码看内部工作机制: scala> val rdd = sc.parallelize(1 to 1000) rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at parallelize at <console>:21 scala> rdd.persist res0: rdd.type

16、蛤蟆的数据结构笔记之十六栈的应用之栈与递归之汉诺塔问题

16.蛤蟆的数据结构笔记之十六栈的应用之栈与递归之汉诺塔问题 本篇名言:"人生的价值,并不是用时间,而是用深度去衡量的." 继续栈与递归应用,汉诺塔问题. 欢迎转载,转载请标明出处: 1.  汉诺塔问题 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一

数据结构(20)栈与递归

导言 递归 n阶Hanoi塔问题 算法 解析 汉诺塔3阶过程演示 导言 前面阶段用栈实现了表达式求值.括号匹配以及数字转换.这一次,我们介绍栈的另一个重要级别的应用-递归 递归 栈的重要应用是在程序设计语言中实现递归.一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称为递归函数. 递归是程序设计中强有力的工具. 递归是程序设计中一个强有力的工具.其一,很多数学函数是递归定义的,例如: 阶乘函数: Fact(n)={1      若n=1n ? Fact(n?1)     若n>0 2