c - 从堆栈中弹出,程序无限循环

标签 c stack

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

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;
}

最佳答案

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

}

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

<小时/>

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

if(!stack_notempty())

你有没有再三考虑?想象一下在遥远的将来当你调试它时阅读它。

关于c - 从堆栈中弹出,程序无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42762010/

相关文章:

c - 从文件中读取(c 编程)

c - 如何在C中以跨平台方式读取USB串行输入?

pandas - 我如何在不对 Pandas 进行排序的情况下解压?

java - Mapstruct java.util.Stack 转换

gcc - C 代码堆栈中的三重错误

python - 可以将 Python 与英特尔 Atom Developer SDK (C/C++) 结合使用吗?

c - 解决linux核心转储问题

c - 为什么我的 freeMem 函数需要 char* 和 addMem 函数 char**

c++ - c++中引用的使用

我可以将数据推送/弹出到 GCC C 返回堆栈吗?