第三章:3.栈和队列 -- 栈与递归的实现
前言:
栈还有一个总要应用是在程序设计语言中实现递归。一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称作递归函数。
目录:
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.栈和队列 -- 栈与递归的实现相关推荐
- 数据结构与算法(C语言) | 栈和队列——栈(自己做过测试)
栈是一种重要的线性结构,通常称,栈和队列是限定插入和删除只能在表的"端点"进行的线性表.(后进先出) –栈的元素必须"后进先出". –栈的操作只能在这个线性表的 ...
- 实现if_数组实现固定栈和队列+栈与队列相互实现
文章目录 一.数组实现固定栈和队列 1.数组实现固定栈 2.数组实现固定队列 二.栈与队列相互实现 1.两个队列实现栈 2.两个栈实现队列 一.数组实现固定栈和队列 1.数组实现固定栈 代码如下: c ...
- 栈与队列3——用递归和栈操作逆序一个栈
题目 一个栈依次压入1,2,3:此时栈顶到栈底元素分别为:3,2,1:将栈反转,使得栈顶到栈底元素为:1,2,3,仅限递归函数,并且不能使用其他数据结构 思路 使用两个函数reverse和getAnd ...
- 从无到有算法养成篇-栈和队列·栈
一.栈结构示意图 二.栈的常规操作 1.定义一个栈结构 /* 顺序栈结构 */ typedef struct {SElemType data[MAXSIZE];int top; /* 用于栈顶指针 * ...
- 2022天勤考研数据结构笔记 第3章 栈和队列
2022天勤考研数据结构笔记 第3章 栈和队列(更新中) 第3章 栈和队列 3.1 结构体定义 3.2 顺序栈 3.3 链栈 3.4 栈的应用 3.5 顺序队 3.6 链队 第3章 栈和队列 栈和队列 ...
- 算法题复习(栈与队列、二叉树)
目录 栈与队列 栈用于匹配的问题 队列用于堆 二叉树系列 深度遍历,递归与迭代 层序遍历 二叉树属性 二叉树修改与构造 二叉搜索树 公共祖先 二叉搜索树的修改与构造 栈与队列 栈用于匹配的问题 20. ...
- b+树时间复杂度_数据结构:线性表,栈,队列,数组,字符串,树和二叉树,哈希表...
作者:张人大 代码效率优化 复杂度 -- 一个关于输入数据量n的函数 时间复杂度 -- 昂贵 与代码的结构设计有着紧密关系 一个顺序结构的代码,时间复杂度是O(1), 即任务与算例个数 n 无关 空间 ...
- 队列的基本操作_算法与数据结构(五) 栈和队列
? 工欲善其事,必先利其器. 栈和队列 - Stack And Queue 栈 如何理解栈呢? 后进者先出,先进者后出,这就是典型的 "栈" 结构. 04_栈和队列-栈结构 从栈的 ...
- 【java学习之路】(数据结构篇)002.栈和队列
栈和队列 栈的实现(容器使用前一篇的数组容器) 1.stack接口定义 package subject.lesson02;public interface Stack<T> {//是否为空 ...
最新文章
- Xmind笔记之HTML5+CSS
- Mybatis中的collection、association来处理结果映射
- fc-ae-1553_什么是AE-L,AF-L和*按钮,它们的作用是什么?
- 静物摄影用光技巧_摄影技巧:摄影如何用光?摄影大师总结的10点,非常受用!...
- 学生信息管理系统c 语言程序设计报告,C语言程序设计报告(学生信息管理系统)[1].txt...
- Java this, super深入理解
- python学习[第二篇] 基础二
- kafka 0.8.2版本配置选项翻译
- Hi3559AV100移植友方4G模块N720V5(二)
- Sci-Hub桌面版 告别网站被封的尴尬
- Linux du命令详解
- Python OpenCV:利用滚动条移动图片,利用鼠标缩放图片
- 从目标检测到小目标检测
- CGAL 4.11 官方文档 软件包概述 ——胞腔复形与多面体类
- mysql5.5手册读书日记(2)
- 使用Termux在安卓手机上搭建本地Git服务器
- 美版iPhone 4s未激活解决方案
- 【百宝云】按键精灵软件注册码系统
- 华为OD机试真题2022(JAVA)
- 本科计算机去当兵,本科毕业了去当兵,提不了干,又不能考军校,该怎么办?...