从堆栈弹出,程序运行无限循环

时间:2017-03-13 11:02:15

标签: c stack

此处的程序在 中运行无限循环,而 循环,尽管它被限制为在堆栈为空时停止。

void printPostorder(TreeNode *pn)
{
TreeNode* temp=pn;
TreeNode* prev=NULL;
if(!pn)
  return;
push(temp);
while(stack_notempty())
{
    temp=topnode();
    if(prev==NULL||prev->left==temp||prev->right==temp)
    {
        if(temp->left)
            push(temp->left);
        if(temp->right)
            push(temp->right);
        if(temp->right==NULL&&temp->left==NULL)
        {
            printf("%d,",temp->data);
            pop();
        }
    }
    if(prev==temp->left)
    {
        if(temp->right)
            push(temp->right);
        else
        {
            printf("%d,",temp->data);
            pop();
        }
    }
    if(prev==temp->right)
    {
        printf("%d,",temp->data);
        pop();
    }
    prev=temp;
}

}

堆栈操作是:

int stack_notempty()
{
if(s.top==-1||s.top<-1)
    {
    return 0;
    }
else 
    return 1;

}

上面的函数在堆栈为空时返回零​​,从而结束循环

void push (TreeNode* node)
{

if (s.top == (MAXSIZE - 1))
{
    printf ("Stack is Full\n");
    return;
}
else
{
    s.top = s.top + 1;
    s.stk[s.top] = node;
}
return;
}
TreeNode* pop ()
{
TreeNode* node;

    node = s.stk[s.top];
    s.top = s.top - 1;

return(node);
}

TreeNode* topnode()
{
TreeNode* tnod;
tnod = pop();
push(tnod);
return tnod;
}

1 个答案:

答案 0 :(得分:3)

int stack_notempty()
{
if(s.top==-1||s.top<-1)
    {
    return 0;
    }

}

此处并非所有分支都返回值。因此,任何依赖于此值的代码的行为都是未定义的。如果声明函数返回某些内容,则必须始终返回值。

旁注,但将谓词命名为否定有点令人困惑。想象一下这样的代码:

if(!stack_notempty())

你做了双重拍摄吗?想象一下,在你调试它的时候,在遥远的未来阅读它。