将递归改成非递归后,还是遇到栈溢出导致的运行出错,求助
时间:2011-12-13
来源:互联网
win7下的VC++6.0,单文档MFC。程序主要是对8位灰度图像进行填充。
之前我做了一个递归,在图像大小较小时(例如20*10)就没问题,而在实验用的356*200大小图像就会出错,应该是递归深度过大的原因。因此改为了非递归方式。具体是自己写了一个头文件,用来自定义栈的入栈、出栈操作。但在运行时还是出错,而且同之前因递归深度过大时出错一样,能对小图像正常处理,而在处理大图像时出错。
我想请教,既然非递归方式中,我已经是使用自定义栈操作了,使用的应该是new出来的堆空间,为什么还是会有错误呢?难道是程序自动分配的,用以管理堆空间的变量导致栈满了吗?
以下是自定义栈的完整代码:
C/C++ code
以下是具体使用时的关键代码:
C/C++ code
之前我做了一个递归,在图像大小较小时(例如20*10)就没问题,而在实验用的356*200大小图像就会出错,应该是递归深度过大的原因。因此改为了非递归方式。具体是自己写了一个头文件,用来自定义栈的入栈、出栈操作。但在运行时还是出错,而且同之前因递归深度过大时出错一样,能对小图像正常处理,而在处理大图像时出错。
我想请教,既然非递归方式中,我已经是使用自定义栈操作了,使用的应该是new出来的堆空间,为什么还是会有错误呢?难道是程序自动分配的,用以管理堆空间的变量导致栈满了吗?
以下是自定义栈的完整代码:
C/C++ code
struct Stack//自定义栈结构体 { int *elem; int top; int stactSize;//栈数组长度 }; void initStack(Stack &S,int nSize)//栈的初始化 { S.elem=new int[nSize]; S.top=-1; S.stactSize=nSize; } void releaseStack(Stack &S)//栈空间释放 { delete S.elem; } void push(Stack &S,int in)//入栈 { S.elem[++S.top]=in; } void pop(Stack &S,int &out)//出栈 { out=S.elem[S.top--]; } int isEmpty(Stack &S)//判断栈空 { if(S.top==-1) return 1; else return 0; }
以下是具体使用时的关键代码:
C/C++ code
Stack S; initStack(S,Width*Height); i=0,j=0; while( A ) { if( B ) { push(S,i); push(S,j); j+=1; } else if( C ) { push(S,i); push(S,j); i+=1; } else if( D ) { push(S,i); push(S,j); j-=1; } else if( E ) { push(S,i); push(S,j); i-=1; } else { pop(S,j); pop(S,i); } }*/
作者: snisn 发布时间: 2011-12-13
是不是越界了
void push(Stack &S,int in)//入栈
{
S.elem[++S.top]=in;
}
的内部处理,应该判断一下是不是到了栈顶,返回入栈成功/失败。
void push(Stack &S,int in)//入栈
{
S.elem[++S.top]=in;
}
的内部处理,应该判断一下是不是到了栈顶,返回入栈成功/失败。
作者: relaxisland 发布时间: 2011-12-13
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28