日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2025/4/9 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第三章:3.栈和队列 -- 栈与递归的实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言:

  棧還有一個(gè)總要應(yīng)用是在程序設(shè)計(jì)語(yǔ)言中實(shí)現(xiàn)遞歸。一個(gè)直接調(diào)用自己或通過(guò)一系列的調(diào)用語(yǔ)句間接地調(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ù)、廣義表等,由于數(shù)據(jù)結(jié)構(gòu)本身固有的遞歸特性,則他們的操作可遞歸的描述。

    

    3)還有一類,雖然本身沒(méi)有明顯的遞歸結(jié)構(gòu),但用遞歸求解會(huì)更加簡(jiǎn)單,以 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.栈和队列 -- 栈与递归的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。