数据结构 栈的基本操作 进制转换 为什么运行后会陷入死循环

```#include
#include
#include
#define OK 1
#define ERROR -1
#define OVERFLOW -1
#define ENDFLAG 0
#define STACK_INIT_SIZE 100//初始分配量
#define STACKINCREMENT 10//增量
typedef int Status;
typedef int SElemType;
typedef struct
{
SElemType *base;//指向栈底,栈构造之前和销毁之后,都为NULL;
SElemType *top;//指向栈顶
int stacksize;//当前已分配的空间,即当前栈的总大小
}SqStack;
void InitStack (SqStack *S)//初始化
{
S->base = (SElemType * )malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(!S->base)
exit(OVERFLOW);
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;

}
Status GetTop(SqStack S,SElemType *e)//获取栈顶元素值
{
if(S.top == S.base)//先判断栈是否为空 为何这里用.行 而用->却不能通过编译
return ERROR;
e = (S.top - 1);//注意这里的e是指针 写成e = *(S.top - 1这个样子 有一定的不妥当
return OK;

};
Status push (SqStack *S,SElemType e)//元素入栈
{
if(S->top - S->base >= S->stacksize)//栈满,增加空间!
{
S->base = (SElemType *) realloc (S->base,(S->stacksize + STACKINCREMENT) *sizeof(SElemType));
if(!S->base)
exit(OVERFLOW);
S->top = S->base + S->stacksize;
S->stacksize += STACKINCREMENT;
}
*S->top++ = e;
return OK;
}
Status Pop (SqStack *S,SElemType *e)//出栈
{
if((S->top = S->base)) return ERROR;
e = --S->top;
return OK;
}
void d_to_o(int n,int m)//进制转换
{
SqStack s;
SElemType e;
InitStack(&s);//构造空栈
while(n)
{
push(&s,n%m);
n = n/m;
}
while((s.top = s.base))
{
Pop(&s,&e);
printf("%d",e);
}

}

int main()
{ SElemType n,m;
system("CLS");
//clrscr();
printf("Input the data that you want to exchange : ");
scanf("%d",&n);
printf("Input the redix_numberdata :");
scanf("%d",&m);
system("CLS");
//clrscr();
printf("\nThe result is as the follow:\n");
printf("\n(%d)10=(",n);
d_to_o(n,m);
printf(")%d",m);
getch();
}










![图片说明](https://img-ask.csdn.net/upload/201605/23/1464014941_888003.png)

http://blog.csdn.net/kkkkkxiaofei/article/details/8290692

while((s.top=s.base))除非base为空,不然永远true

d_to_o函数里第二个while循环少了个=
应该是while((s.top == s.base))

 #include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define OK 1
#define ERROR -1
#define OVERFLOW -1
#define ENDFLAG 0
#define STACK_INIT_SIZE 100//初始分配量
#define STACKINCREMENT 10//增量
typedef int Status;
typedef int SElemType;
typedef struct
{
    SElemType *base;//指向栈底,栈构造之前和销毁之后,都为NULL;
    SElemType *top;//指向栈顶
    int stacksize;//当前已分配的空间,即当前栈的总大小
}SqStack;
void  InitStack (SqStack *S)//初始化
{
    S->base = (SElemType * )malloc(STACK_INIT_SIZE * sizeof(SElemType));
    if(!S->base)
    exit(OVERFLOW);
    S->top = S->base;
    S->stacksize = STACK_INIT_SIZE;

}
Status  GetTop(SqStack S,SElemType *e)//获取栈顶元素值
{
    if(S.top == S.base)//先判断栈是否为空 为何这里用.行 而用->却不能通过编译
        return ERROR;
    e = (S.top - 1);//注意这里的e是指针 写成e = *(S.top - 1这个样子 有一定的不妥当
    return OK;

};
Status  push (SqStack *S,SElemType e)//元素入栈
{
    if(S->top - S->base >= S->stacksize)//栈满,增加空间!
    {
        S->base = (SElemType *) realloc (S->base,(S->stacksize + STACKINCREMENT) *sizeof(SElemType));
         if(!S->base)
          exit(OVERFLOW);
          S->top = S->base + S->stacksize;
          S->stacksize += STACKINCREMENT;
    }
   *S->top++ = e;
   return OK;
}
Status Pop (SqStack *S,SElemType *e)//出栈
{
    if((S->top = S->base))  return ERROR;
    e = --S->top;
    return OK;
}
void d_to_o(int n,int m)//进制转换
{
  SqStack s;
  SElemType e;
  InitStack(&s);//构造空栈
  while(n)
  {
      push(&s,n%m);
      n = n/m;
  }
  while((s.top == s.base))
  {
      Pop(&s,&e);
      printf("%d",e);
  }


}

int main()
{   SElemType n,m;
    system("CLS");
    //clrscr();
    printf("Input the data that you want to exchange : ");
    scanf("%d",&n);
    printf("Input the redix_numberdata :");
    scanf("%d",&m);
    system("CLS");
    //clrscr();
    printf("\nThe result is as the follow:\n");
    printf("\n(%d)10=(",n);
    d_to_o(n,m);
    printf(")%d",m);
   getch();
}