此处的程序在 中运行无限循环,而 循环,尽管它被限制为在堆栈为空时停止。
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;
}
答案 0 :(得分:3)
int stack_notempty()
{
if(s.top==-1||s.top<-1)
{
return 0;
}
}
此处并非所有分支都返回值。因此,任何依赖于此值的代码的行为都是未定义的。如果声明函数返回某些内容,则必须始终返回值。
旁注,但将谓词命名为否定有点令人困惑。想象一下这样的代码:
if(!stack_notempty())
你做了双重拍摄吗?想象一下,在你调试它的时候,在遥远的未来阅读它。