+ -
当前位置:首页 → 问答吧 → 将递归改成非递归后,还是遇到栈溢出导致的运行出错,求助

将递归改成非递归后,还是遇到栈溢出导致的运行出错,求助

时间:2011-12-13

来源:互联网

win7下的VC++6.0,单文档MFC。程序主要是对8位灰度图像进行填充。
之前我做了一个递归,在图像大小较小时(例如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;
}
的内部处理,应该判断一下是不是到了栈顶,返回入栈成功/失败。

作者: relaxisland   发布时间: 2011-12-13