第三章:3.栈和队列 -- 栈与递归的实现
前言:
棧還有一個(gè)總要應(yīng)用是在程序設(shè)計(jì)語言中實(shí)現(xiàn)遞歸。一個(gè)直接調(diào)用自己或通過一系列的調(diào)用語句間接地調(diào)用自己的函數(shù),稱作遞歸函數(shù)。
?
目錄:
1、棧
2、棧的應(yīng)用舉例
3、棧與遞歸的實(shí)現(xiàn)
4、隊(duì)列
5、離散事件模型
?
正文:
3、棧與遞歸的實(shí)現(xiàn)
遞歸程序設(shè)計(jì)是一個(gè)強(qiáng)有力的工具。
1)很多數(shù)學(xué)函數(shù)是遞歸調(diào)用的
階乘:??? Fact(n)=n * (n-1) * (n-2) * ...... * 2 * 1
斐波那契數(shù)列、阿克曼函數(shù) 等
?
2)有的數(shù)據(jù)結(jié)構(gòu),如二叉樹、廣義表等,由于數(shù)據(jù)結(jié)構(gòu)本身固有的遞歸特性,則他們的操作可遞歸的描述。
3)還有一類,雖然本身沒有明顯的遞歸結(jié)構(gòu),但用遞歸求解會(huì)更加簡單,以 hanoi 漢諾塔 為例。
?
代碼實(shí)現(xiàn):
#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是函數(shù)的類型,其值是函數(shù)結(jié)果狀態(tài)碼 typedef int Status; typedef int SElemType; //typedef char SElemType; typedef struct {SElemType * base;SElemType * top;int stacksize; }SqStack;//構(gòu)造空棧 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){ //空間不夠,繼續(xù)分配空間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 個(gè)元素 按照同樣的順序 放到 塔 Z上。 void Hanoi(int n,SqStack &X,SqStack &Y,SqStack &Z){ if(n==1){move(X,n,Z); //從X 柱 往 Y 柱 移動(dòng)元素 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","調(diào)用Hanoi 函數(shù)之后:");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òng):%d次\n",MoveNum);}運(yùn)行結(jié)果:
?
轉(zhuǎn)載于:https://www.cnblogs.com/ahguSH/p/6202537.html
總結(jié)
以上是生活随笔為你收集整理的第三章:3.栈和队列 -- 栈与递归的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 即时通讯 TCP UDP
- 下一篇: c语言实现字符指针(字符串)数组的排序