只能运行到中序非递归处,后面的计算叶子等无法输出

二叉树的中序非递归算法,我在开始把top赋值为0,后面入栈时top++,出栈时--top,程序就会运行完这段之后停了,但是当我把top赋值为-11,入栈改为++top,出栈改为top--,就能正确输出了,为什么呢?
#include<stdio.h>
#include<malloc.h>
#define MAX 20
typedef struct BTNode{ /节点结构声明/
char data ; /节点数据/
struct BTNode *lchild;
struct BTNode *rchild ; /指针/
}*BiTree;

void createBiTree(BiTree t){ / 先序遍历创建二叉树*/
char s;
BiTree q;
printf("\nplease input data:(exit for #)");
s=getche();
if(s=='#'){*t=NULL; return;}
q=(BiTree)malloc(sizeof(struct BTNode));
if(q==NULL){printf("Memory alloc failure!"); exit(0);}
q->data=s;
*t=q;
createBiTree(&q->lchild); /递归建立左子树/
createBiTree(&q->rchild); /递归建立右子树/
}

void PreOrder(BiTree p){ /* 先序遍历二叉树*/
if ( p!= NULL ) {
printf("%c", p->data);
PreOrder( p->lchild ) ;
PreOrder( p->rchild) ;
}
}
void InOrder(BiTree p){ /* 中序遍历二叉树*/
if( p!= NULL ) {
InOrder( p->lchild ) ;
printf("%c", p->data);
InOrder( p->rchild) ;
}
}
void PostOrder(BiTree p){ /* 后序遍历二叉树*/
if ( p!= NULL ) {
PostOrder( p->lchild ) ;
PostOrder( p->rchild) ;
printf("%c", p->data);
}
}

void Preorder_n(BiTree p){ /先序遍历的非递归算法/
BiTree stack[MAX],q;
int top=0,i;
for(i=0;i<MAX;i++) stack[i]=NULL;/初始化栈*/
q=p;
while(q!=NULL){
printf("%c",q->data);
if(q->rchild!=NULL) stack[top++]=q->rchild;
if(q->lchild!=NULL) q=q->lchild;
else
if(top>0) q=stack[--top];
else q=NULL;
}
}
/
这种方法无法正常运行后面的程序 (改为;)
void Inorder_n(BiTree p)
{
BiTree stack[MAX],q;
int top=0;
q=p;
while(q!=NULL||top>=0){
if(q!=NULL){
stack[++top]=q;
q=q->lchild ;
}
else{
q=stack[top--];
printf("%c",q->data );
q=q->rchild ;
}
}
}/
/
这种方法无法正常输出(改为stack[top++]=q;)
void Inorder_n(BiTree p)
{
BiTree stack[MAX],q;
int top=0;
q=p;
while(q!=NULL||top>=0){
if(q!=NULL){
stack[top++]=q;
q=q->lchild ;
}
else{
q=stack[top--];
printf("%c",q->data );
q=q->rchild ;
}
}
}*/
void Inorder_n(BiTree p)
{
BiTree stack[MAX],q;
int top=-1,i;
for(i=0;i<MAX;i++) stack[i]=NULL;/*初始化栈*/
q=p;
while(q!=NULL||top!=-1){
if(q!=NULL){
stack[++top]=q;
q=q->lchild ;
}
else{
q=stack[top--];
printf("%c",q->data );
q=q->rchild ;
}
}
}

void release(BiTree t){ /释放二叉树空间/
if(t!=NULL){
release(t->lchild);
release(t->rchild);
free(t);
}
}

int Nodecount(BiTree t){
if(t == NULL) return 0;
else return Nodecount(t->lchild )+Nodecount(t->rchild )+1;
}

int leavescount(BiTree t){
if(t==NULL) return 0;
if(t->lchild ==NULL&&t->rchild ==NULL) return 1;
else return leavescount(t->lchild )+leavescount(t->rchild );
}

int treeheight(BiTree t){
if(t==NULL) return 0;
else {
int l=treeheight(t->lchild );
int r=treeheight(t->rchild );
int m=l>=r?l:r;
++m;
return m;
}
}

int main(){
BiTree t=NULL;
createBiTree(&t);
printf("\n\nPreOrder the tree is:");
PreOrder(t);
printf("\n\nInOrder the tree is:");
InOrder(t);
printf("\n\nPostOrder the tree is:");
PostOrder(t);
printf("\n\n先序遍历序列(非递归):");
Preorder_n(t);
printf("\n\n中序遍历序列(非递归):");
Inorder_n(t);
printf("\n\n结点总数为:%d",Nodecount(t));
printf("\n\n叶子结点总数为:%d",leavescount(t));
printf("\n\n该树的高度为:%d",treeheight(t));
release(t);
return 0;
}

stack[--top];
如果是1
是先 --top 然后stack[top] 那么结果就是 stack[0]
stack[top--]
则不同
是先赋值,stack[1],然后再top--;