栈 递归.docx
- 文档编号:24638485
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:16
- 大小:21.33KB
栈 递归.docx
《栈 递归.docx》由会员分享,可在线阅读,更多相关《栈 递归.docx(16页珍藏版)》请在冰豆网上搜索。
栈递归
//1、SElemType类型定义
typedefintSElemType;
//2、栈的顺序存储结构
#defineSTACK_INIT_SIZE100/*存储空间初始分配量*/
#defineSTACKINCREMENT10/*存储空间分配增量*/
typedefstructSqStack
{
SElemType*base;/*在栈构造之前和销毁之后,base的值为NULL*/
SElemType*top;/*栈顶指针*/
intstacksize;/*当前已分配的存储空间,以元素为单位*/
}SqStack;/*顺序栈*/
//3、栈的运算(9个函数原型声明)
StatusInitStack(SqStack&S);
/*构造一个空栈S*/
StatusDestroyStack(SqStack&S);
/*销毁栈S,S不再存在*/
StatusStackEmpty(SqStackS);
/*若栈S为空栈,则返回TRUE,否则返回FALSE*/
StatusPush(SqStack&S,SElemTypee);
/*插入元素e为新的栈顶元素*/
StatusPop(SqStack&S,SElemType&e);
/*若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR*/
voidconversion(intt,inta[100],int&m);
#include"shizhiyi.h"
//调用函数的实现
StatusInitStack(SqStack&S)
{/*构造一个空栈S*/
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!
S.base)
return(OVERFLOW);/*存储分配失败*/
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
returnOK;
}
StatusDestroyStack(SqStack&S)
{/*销毁栈S,S不再存在*/
free(S.base);
S.base=NULL;
S.top=NULL;
S.stacksize=0;
returnOK;
}
StatusStackEmpty(SqStackS)
{/*若栈S为空栈,则返回TRUE,否则返回FALSE*/
if(S.top==S.base)returnTRUE;
elsereturnFALSE;
}
StatusPush(SqStack&S,SElemTypee)
{/*插入元素e为新的栈顶元素*/
if((S.top-S.base)>=S.stacksize)
{
S.base=(SElemType*)realloc(S.base,
(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!
S.base)return(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
returnOK;
}
StatusPop(SqStack&S,SElemType&e)
{/*若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR*/
if(S.top==S.base)returnERROR;
e=*--S.top;
returnOK;
}
1、参考工程shiyan3_1,其中StackEmpty()、StackLength()、GetTop()、Push()、Pop()未实现,请将其完善,并设计一个主程序实现如下功能:
(1)初始化栈S。
(2)判断栈S是否非空。
(3)依次进栈元素a,b,c,d,e。
(4)判断栈S是否非空。
(5)输出栈的长度。
(6)输出从栈顶到栈底的元素。
(7)输出出栈序列。
(8)判断栈S是否非空。
(9)释放栈。
(1)源代码
#include"stdio.h"
#include"malloc.h"
//函数结果状态代码,教材伪c语言用到的常量定义
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
typedefintStatus;/*Status是函数的类型,其值是函数结果状态代码,如OK等*/
typedefintBoolean;/*Boolean是布尔类型,其值是TRUE或FALSE*/
//以下是本题的头文件定义,由四个部分组成:
//1、SElemType类型定义
typedefcharSElemType;
//2、栈的顺序存储结构
#defineSTACK_INIT_SIZE100/*存储空间初始分配量*/
#defineSTACKINCREMENT10/*存储空间分配增量*/
typedefstructSqStack
{
SElemType*base;/*在栈构造之前和销毁之后,base的值为NULL*/
SElemType*top;/*栈顶指针*/
intstacksize;/*当前已分配的存储空间,以元素为单位*/
}SqStack;/*顺序栈*/
//3、栈的运算(9个函数原型声明)
StatusInitStack(SqStack&S);
/*构造一个空栈S*/
StatusDestroyStack(SqStack&S);
/*销毁栈S,S不再存在*/
StatusClearStack(SqStack&S);
/*把S置为空栈*/
StatusStackEmpty(SqStackS);
/*若栈S为空栈,则返回TRUE,否则返回FALSE*/
intStackLength(SqStackS);
/*返回S的元素个数,即栈的长度*/
StatusGetTop(SqStackS,SElemType&e);
/*若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR*/
StatusPush(SqStack&S,SElemTypee);
/*插入元素e为新的栈顶元素*/
StatusPop(SqStack&S,SElemType&e);
/*若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR*/
StatusStackTraverse(SqStackS,void(*vi)(SElemType&));
/*从栈底到栈顶依次对栈中每个元素调用函数visit()。
*/
/*一旦visit()失败,则操作失败*/
//4、一般函数
voidvisit(SElemType&);
#include"SqStack.h"
voidvisit(SElemType&c)/*ListTraverse()调用的函数(类型要一致)*/
{
printf(">%c",c);
}
//函数实现
StatusInitStack(SqStack&S)
{/*构造一个空栈S*/
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!
S.base)
return(OVERFLOW);/*存储分配失败*/
S.top=S.base;a
S.stacksize=STACK_INIT_SIZE;
returnOK;
}
StatusDestroyStack(SqStack&S)
{/*销毁栈S,S不再存在*/
free(S.base);
S.base=NULL;
S.top=NULL;
S.stacksize=0;
returnOK;
}
StatusClearStack(SqStack&S)
{/*把S置为空栈*/
S.top=S.base;
returnOK;
}
StatusStackEmpty(SqStackS)
{/*若栈S为空栈,则返回TRUE,否则返回FALSE*/
if(S.top==S.base)returnTRUE;
elsereturnFALSE;
}
intStackLength(SqStackS)
{/*返回S的元素个数,即栈的长度*/
return(S.top-S.base);
}
StatusGetTop(SqStackS,SElemType&e)
{/*若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR*/
if(S.top==S.base)returnERROR;
e=*(S.top-1);
returnOK;
}
StatusPush(SqStack&S,SElemTypee)
{/*插入元素e为新的栈顶元素*/
if((S.top-S.base)>=S.stacksize)
{
S.base=(SElemType*)realloc(S.base,
(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!
S.base)return(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
returnOK;
}
StatusPop(SqStack&S,SElemType&e)
{/*若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR*/
if(S.top==S.base)returnERROR;
e=*--S.top;
returnOK;
}
StatusStackTraverse(SqStackS,void(*vi)(SElemType&))
{/*从栈底到栈顶依次对栈中每个元素调用函数visit()。
*/
/*一旦visit()失败,则操作失败*/
SElemType*p=S.base;
while(S.top>p)
(*vi)(*p++);
returnOK;
}
#include"SqStack.h"
voidmain()
{
SqStackS;
Statusi;
SElemTypej;
intk;
i=InitStack(S);
printf("初始化是否成功:
%d(1:
成功0:
失败)\n",i);
i=StackEmpty(S);
printf("S是否空:
%d(1:
空0:
不空)\n",i);
for(j='a';j<='e';j++)
Push(S,j);
a
i=StackEmpty(S);
printf("S是否空:
%d(1:
空0:
不空)\n",i);
k=StackLength(S);
printf("S的长度:
%d\n",k);
StackTraverse(S,visit);
printf("输出S出栈序列:
");
for(k=1;k<6;k++)
{
Pop(S,j);
printf("%8c",j);
}
printf("\n");
i=StackEmpty(S);
printf("S是否空:
%d(1:
空0:
不空)\n",i);
DestroyStack(S);
}
2.如果用一个循环数组q[0..m-1]表示队列时,该队列只有一个队列头指针front,不设队列尾指针rear,而改置计数器count用以记录队列中结点的个数。
(1)编写实现队列的三个基本运算:
判空、入队、出队
(2)队列中能容纳元素的最多个数是多少?
typedefstruct
{elemtpq[m];
intfront,count;//front是队首指针,count是队列中元素个数。
}cqnode;//定义类型标识符。
(1)判空:
intEmpty(cqnodecq)//cq是cqnode类型的变量
{if(cq.count==0)return
(1);elsereturn(0);//空队列}
入队:
intEnQueue(cqnodecq,elemtpx)
{if(count==m){printf(“队满\n”);exit(0);}
cq.q[(cq.front+count)%m]=x;//x入队
count++;return
(1);//队列中元素个数增加1,入队成功。
}
出队:
intDelQueue(cqnodecq)
{if(count==0){printf(“队空\n”);return(0);}
printf(“出队元素”,cq.q[cq.front]);
x=cq.q[cq.front];
cq.front=(cq.front+1)%m;//计算新的队头指针。
return(x)
}
(2)队列中能容纳的元素的个数为m。
队头指针front指向队头元素。
已知递归函数:
F(n)=
编写工程shiyan3_4,实现;
(1)求F(n)的递归算法fun1(n)。
(2)采用循环结构消除递归,编写出求F(n)的非递归算法fun2(n)。
(3)采用栈消除递归,编写出求F(n)的非递归算法fun3(n)。
1.源代码
#include"stdio.h"
#include"malloc.h"
//函数结果状态代码,教材伪c语言用到的常量定义
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
typedefintStatus;/*Status是函数的类型,其值是函数结果状态代码,如OK等*/
typedefintBoolean;/*Boolean是布尔类型,其值是TRUE或FALSE*/
//以下是本题的头文件定义,由四个部分组成:
//1、SElemType类型定义
typedefintSElemType;
//2、栈的顺序存储结构
#defineSTACK_INIT_SIZE100/*存储空间初始分配量*/
#defineSTACKINCREMENT10/*存储空间分配增量*/
typedefstructSqStack
{
SElemType*base;/*在栈构造之前和销毁之后,base的值为NULL*/
SElemType*top;/*栈顶指针*/
intstacksize;/*当前已分配的存储空间,以元素为单位*/
}SqStack;/*顺序栈*/
//3、栈的运算(函数原型声明)
StatusInitStack(SqStack&S);
/*构造一个空栈S*/
StatusDestroyStack(SqStack&S);
/*销毁栈S,S不再存在*/
StatusPush(SqStack&S,SElemTypee);
/*插入元素e为新的栈顶元素*/
StatusPop(SqStack&S,SElemType&e);
/*若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR*/
intfun1(intn);
intfun2(intn);
intfun3(intn);
#include"head.h"
StatusInitStack(SqStack&S)
{/*构造一个空栈S*/
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!
S.base)
return(OVERFLOW);/*存储分配失败*/
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
returnOK;
}
StatusDestroyStack(SqStack&S)
{/*销毁栈S,S不再存在*/
free(S.base);
S.base=NULL;
S.top=NULL;
S.stacksize=0;
returnOK;
}
StatusPush(SqStack&S,SElemTypee)
{/*插入元素e为新的栈顶元素*/
if((S.top-S.base)>=S.stacksize)
{
S.base=(SElemType*)realloc(S.base,
(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!
S.base)return(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
returnOK;
}
StatusPop(SqStack&S,SElemType&e)
{/*若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR*/
if(S.top==S.base)returnERROR;
e=*--S.top;
returnOK;
}
intfun1(intn)
{
if(n==0)return1;
elsereturnn*fun1(n/2);
}
intfun2(intn)
{
inti,s=1;
for(i=n;i>=1;i=i/2)
s*=i;
returns;
}
intfun3(intn)
{
inti,j,k=1;
SqStacks;
InitStack(s);
for(i=n;i>=1;i=i/2)
Push(s,i);
for(i=n;i>=1;i=i/2)
{
Pop(s,j);
k*=j;
}
DestroyStack(s);
returnk;
}
#include"head.h"
voidmain()
{
intn,a,b,c;
scanf("%d",&n);
a=fun1(n);
b=fun2(n);
c=fun3(n);
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 递归
![提示](https://static.bdocx.com/images/bang_tan.gif)