求助:C++递归出现堆栈溢出怎么解决

求助:C++递归出现堆栈溢出怎么解决,第1张

递归最容易导致的问题就是堆栈溢出了,一般来说 *** 作系统给一个进程划分的栈内存是2M(好像是),按照正常的程序处理,锋困告局部变量进尺槐栈出栈,栈不太可能会溢出,但是递银明归会导致不会出栈,这就有可能导致堆栈溢出,你这里定义两个int型变量,即8字节,再加上保存的函数地址等信息,*100000次递归,还有一些其他的入栈的局部变量,可能已经超出了最大的栈空间,所以溢出。

放到后面, 按上面晌锋你说的, 也是不行猜谨竖.

DefaultPrj.exe 中的 0x00f215ec 处有未经处理穗大的异常: 0xC00000FD: Stack overflow

递归算法和栈都有后进先出这个性质,基本上能用递归完成的算法都可以用栈完成,都是运用后进先出这个性质的

用栈之前首先你要想明白你需要使用“后进先出”干什么漏庆激,然差旁后才可编写算法,使用中往往是先把数据都压入栈中,然后使用使取出便可,

像表达式求解就是典型的运用栈的例子,可以去看看,会对栈的理解印象深刻些

# include <stdio.h>

# define origial 100

# define add 10

typedef struct

{

int *base

int *top

int stack

}opno

typedef struct

{

char *base

char *top

int stack

}optr

void initstacka(opno *a)

{

a->base=(int *)malloc(sizeof(int)*origial)

a->top=a->base

a->stack=origial

}

void initstackb(optr *b)

{

b->base=(char *)malloc(sizeof(char)*origial)

b->top=b->base

b->stack=origial

*b->top++='#'

}

void pusha(opno *a,int b)

{

if(a->top-a->base>=a->stack)

{

a->base=(int *)realloc(a->base,sizeof(int)*(a->stack+add))

a->top=a->base+a->stack

a->stack+=add

}

*a->top++=b

}

void pushb(optr *b,char c)

{

if(b->top-b->base>=b->stack)

{

b->base=(char *)realloc(b->base,sizeof(char)*(b->stack+add))

b->top=b->base+b->stack

b->stack+=add

}

*b->top++=c

}

int determine(char c)

{

if(c>='0'&&c<='9')

return(1)

else

return(0)

}

char gettopb(optr *b)

{

char a

a=*(b->top-1)

return(a)

}

char shuzu(int i,int j)

{

char a[7][7]={{'>','>','<','<','<','>','>'},{'>','>','返袜<','<','<','>','>'},{'>','>','>','>','<','>','>'},{'>','>','>','>','<','>','>'},{'<','<','<','<','<','=','0'},{'>','>','>','>','0','>','>'},{'<','<','<','<','<','0','='}}

return(a[i][j])

}

char precede(char b,char a)

{

int i,j

char s

switch(b)

{

case '+':i=0

break

case '-':i=1

break

case '*':i=2

break

case '/':i=3

break

case '(':i=4

break

case ')':i=5

break

case '#':i=6

break

}

switch(a)

{

case '+':j=0

break

case '-':j=1

break

case '*':j=2

break

case '/':j=3

break

case '(':j=4

break

case ')':j=5

break

case '#':j=6

break

}

s=shuzu(i,j)

return(s)

}

void popb(optr *a,char *b)

{

*b=*--a->top

}

void popa(opno *a,int *b)

{

*b=*--a->top

}

int count(int a,int b,char c)

{

int sum=0

switch(c)

{

case '+':sum=a+b

break

case '-':sum=a-b

break

case '*':sum=a*b

break

case '/':sum=a/b

break

}

return(sum)

}

int empty(optr *a)

{

if(a->top==a->base)

return(1)

else

return(0)

}

void main()

{

opno *a

optr *b

char c

char d[50]

int i=0,j=0,k,sum=0,p,o,r,w

int y[3]

a=(opno *)malloc(sizeof(opno))

b=(optr *)malloc(sizeof(optr))

initstacka(a)

initstackb(b)

printf("请输入表达式!\n")

scanf("%s",d)

while(d[i]!='#'&&d[i]!='\0')

if(determine(d[i]))

{

sum=0

y[j]=d[i]-'0'

while(determine(d[i+1]))

{

i=i+1

y[++j]=d[i]-'0'

}

for(k=0k<=jk++)

sum=sum*10+y[k]

if(sum!=0)

pusha(a,sum)

else

pusha(a,y[0])

j=0

for(k=0k<3k++)

y[k]=0

i=i+1

}

else

{

switch(precede(gettopb(b),d[i]))

{

case '>':popb(b,&c)

popa(a,&p)

popa(a,&o)

r=count(o,p,c)

pusha(a,r)

break

case '=':popb(b,&c)

i++

break

case '<':pushb(b,d[i])

i++

break

}

}

popb(b,&c)

while(c!='#')

{

popa(a,&o)

popa(a,&p)

r=count(o,p,c)

pusha(a,r)

popb(b,&c)

}

popa(a,&w)

printf("%d",w)

}

这就是运用栈写得表达式求值


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12352596.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存