前言:

  栈还有一个总要应用是在程序设计语言中实现递归。一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称作递归函数。

目录:

  1、栈

  2、栈的应用举例

  3、栈与递归的实现

  4、队列

  5、离散事件模型

正文:

  3、栈与递归的实现

    递归程序设计是一个强有力的工具。

    1)很多数学函数是递归调用的

      阶乘:    Fact(n)=n * (n-1) * (n-2) * ...... * 2 * 1

      斐波那契数列、阿克曼函数 等

    2)有的数据结构,如二叉树、广义表等,由于数据结构本身固有的递归特性,则他们的操作可递归的描述。

    

    3)还有一类,虽然本身没有明显的递归结构,但用递归求解会更加简单,以 hanoi 汉诺塔 为例。

  

  代码实现:

#include<stdio.h>
#include<stdlib.h>
#include <string.h>#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
//Status是函数的类型,其值是函数结果状态码
typedef int Status;
typedef int SElemType;
//typedef char SElemType;

typedef struct {SElemType * base;SElemType * top;int stacksize;
}SqStack;//构造空栈
Status InitStack(SqStack &S){S.base=(SElemType *)malloc(sizeof(SElemType)*STACK_INIT_SIZE);if(!S.base) exit(OVERFLOW);S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;
}//插入元素 (入栈)
Status Push(SqStack &S,SElemType e){if((S.top-S.base)==S.stacksize){                                        //空间不够,继续分配空间S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));if(!S.base) exit(OVERFLOW);S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;
}//删除元素(出栈)
Status Pop(SqStack &S,SElemType &e){if(S.top!=S.base){e=*(--S.top);}else{return ERROR;}return OK;
}void printAllValues(SqStack &S){SElemType * q=S.top;printf("top:%p\n",q);while(q!=S.base){printf("地址:%p,",q-1);printf("值:%d\n",*(q-1));//printf("值:%c\n",*(q-1));q--;}printf("base:%p\n",S.base);
}//gettop获取栈顶元素
SElemType GetTop(SqStack &S){if(S.base==S.top){return 0;}return *(S.top-1);
}//初始化 汉诺塔 X
void HanoiInit(int n,SqStack &X){for(int i=1;i<=n;n--)Push(X,n);
}//将元素 e 从栈 A 删除 ,插入到栈 B 上。
void move(SqStack &A,int e,SqStack &B){if(GetTop(A)==e){SElemType c;Pop(A,c);Push(B,e);            }
}int MoveNum=0;//将汉诺塔 X 上的 N 个元素 按照同样的顺序 放到 塔 Z上。
void Hanoi(int n,SqStack &X,SqStack &Y,SqStack &Z){    if(n==1){move(X,n,Z);                    //从X 柱 往 Y 柱 移动元素 n ,MoveNum++;}else{Hanoi(n-1,X,Z,Y);move(X,n,Z);MoveNum++;Hanoi(n-1,Y,X,Z);}}void main(){SqStack X;InitStack(X);SqStack Y;InitStack(Y);SqStack Z;InitStack(Z);int n=5;HanoiInit(n,X);printf("%s\n","X柱:");printAllValues(X);printf("%s\n","Y柱:");printAllValues(Y);printf("%s\n","Z柱:");printAllValues(Z);printf("\n%s\n\n","调用Hanoi 函数之后:");Hanoi(5,X,Y,Z);printf("%s\n","X柱:");printAllValues(X);printf("%s\n","Y柱:");printAllValues(Y);printf("%s\n","Z柱:");printAllValues(Z);printf("汉诺塔上的元素共移动:%d次\n",MoveNum);}

运行结果:

  

转载于:https://www.cnblogs.com/ahguSH/p/6202537.html

第三章:3.栈和队列 -- 栈与递归的实现相关推荐

  1. 数据结构与算法(C语言) | 栈和队列——栈(自己做过测试)

    栈是一种重要的线性结构,通常称,栈和队列是限定插入和删除只能在表的"端点"进行的线性表.(后进先出) –栈的元素必须"后进先出". –栈的操作只能在这个线性表的 ...

  2. 实现if_数组实现固定栈和队列+栈与队列相互实现

    文章目录 一.数组实现固定栈和队列 1.数组实现固定栈 2.数组实现固定队列 二.栈与队列相互实现 1.两个队列实现栈 2.两个栈实现队列 一.数组实现固定栈和队列 1.数组实现固定栈 代码如下: c ...

  3. 栈与队列3——用递归和栈操作逆序一个栈

    题目 一个栈依次压入1,2,3:此时栈顶到栈底元素分别为:3,2,1:将栈反转,使得栈顶到栈底元素为:1,2,3,仅限递归函数,并且不能使用其他数据结构 思路 使用两个函数reverse和getAnd ...

  4. 从无到有算法养成篇-栈和队列·栈

    一.栈结构示意图 二.栈的常规操作 1.定义一个栈结构 /* 顺序栈结构 */ typedef struct {SElemType data[MAXSIZE];int top; /* 用于栈顶指针 * ...

  5. 2022天勤考研数据结构笔记 第3章 栈和队列

    2022天勤考研数据结构笔记 第3章 栈和队列(更新中) 第3章 栈和队列 3.1 结构体定义 3.2 顺序栈 3.3 链栈 3.4 栈的应用 3.5 顺序队 3.6 链队 第3章 栈和队列 栈和队列 ...

  6. 算法题复习(栈与队列、二叉树)

    目录 栈与队列 栈用于匹配的问题 队列用于堆 二叉树系列 深度遍历,递归与迭代 层序遍历 二叉树属性 二叉树修改与构造 二叉搜索树 公共祖先 二叉搜索树的修改与构造 栈与队列 栈用于匹配的问题 20. ...

  7. b+树时间复杂度_数据结构:线性表,栈,队列,数组,字符串,树和二叉树,哈希表...

    作者:张人大 代码效率优化 复杂度 -- 一个关于输入数据量n的函数 时间复杂度 -- 昂贵 与代码的结构设计有着紧密关系 一个顺序结构的代码,时间复杂度是O(1), 即任务与算例个数 n 无关 空间 ...

  8. 队列的基本操作_算法与数据结构(五) 栈和队列

    ? 工欲善其事,必先利其器. 栈和队列 - Stack And Queue 栈 如何理解栈呢? 后进者先出,先进者后出,这就是典型的 "栈" 结构. 04_栈和队列-栈结构 从栈的 ...

  9. 【java学习之路】(数据结构篇)002.栈和队列

    栈和队列 栈的实现(容器使用前一篇的数组容器) 1.stack接口定义 package subject.lesson02;public interface Stack<T> {//是否为空 ...

最新文章

  1. Xmind笔记之HTML5+CSS
  2. Mybatis中的collection、association来处理结果映射
  3. fc-ae-1553_什么是AE-L,AF-L和*按钮,它们的作用是什么?
  4. 静物摄影用光技巧_摄影技巧:摄影如何用光?摄影大师总结的10点,非常受用!...
  5. 学生信息管理系统c 语言程序设计报告,C语言程序设计报告(学生信息管理系统)[1].txt...
  6. Java this, super深入理解
  7. python学习[第二篇] 基础二
  8. kafka 0.8.2版本配置选项翻译
  9. Hi3559AV100移植友方4G模块N720V5(二)
  10. Sci-Hub桌面版 告别网站被封的尴尬
  11. Linux du命令详解
  12. Python OpenCV:利用滚动条移动图片,利用鼠标缩放图片
  13. 从目标检测到小目标检测
  14. CGAL 4.11 官方文档 软件包概述 ——胞腔复形与多面体类
  15. mysql5.5手册读书日记(2)
  16. 使用Termux在安卓手机上搭建本地Git服务器
  17. 美版iPhone 4s未激活解决方案
  18. 【百宝云】按键精灵软件注册码系统
  19. 华为OD机试真题2022(JAVA)
  20. 本科计算机去当兵,本科毕业了去当兵,提不了干,又不能考军校,该怎么办?...

热门文章

  1. C# 学习笔记(11)蓝屏小工具
  2. CTFshow 反序列化 web266
  3. [BJDCTF2020]EzPHP 1
  4. Visual Studio 2013运行时卡顿 CPU占用超高的解决方法
  5. 判断二进制数1的个数
  6. 第一章:1.1.3 典型信号
  7. 第三讲 一阶线性ODE
  8. 写爬虫,不会正则怎么行?
  9. mySql中使用命令行建表基本操作
  10. 5.7.4.framebuffer应用编程实践3