这里的程序在 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/