入栈成功,出栈为什么是乱码?

#include
#define ERROR 0
#define OK 1
#define MAXSIZE 1024 //顺序栈的最大容量
typedef int SElemType; //定义栈中元素类型,可调整
typedef struct{
SElemType data[MAXSIZE]; // 顺序栈
int top; //栈顶指针
}SeqStack;
//顺序栈的初始化
int InitStack_Sq (SeqStack *&S)
{
S = new SeqStack;
if(!S) //存储分配失败
return ERROR;
S->top=0; //设置栈顶指针值
return OK;
}
//求顺序栈的长度
int StackLength_Sq (SeqStack *S)
{
return S->top;
}
//销毁顺序栈
int DestroyStack_Sq(SeqStack *&S)
{
if(!S){
delete S;
return OK;
}
return ERROR;
}
//清空栈操作
void ClearStack_Sq (SeqStack *&S)
{
S->top=0;
}
//判断顺序栈是否为空
int StackEmpty_Sq (SeqStack *S)
{
return S->top=0;
}
//判断顺序栈是否已满
int StackFull_Sq (SeqStack *S)
{
return S->top==MAXSIZE;
}
//入栈操作
int Push_Sq(SeqStack *S, SElemType e)
{
if (StackFull_Sq(S))
return ERROR; //栈已满
S->data[S->top++]=e;
return OK;
}
//出栈操作
int Pop_Sq(SeqStack *S, SElemType &e)
{
if (StackEmpty_Sq(S))
return ERROR; // 栈空
e=S->data[--S->top];
return OK;
}
//取栈顶元素
int GetTop_Sq(SeqStack *S,SElemType &e)
{
if(StackEmpty_Sq(S)) // 栈空
return ERROR;
e=S->data[S->top-1];
return OK;
}
void DispStack_Sq(SeqStack *S) // 输出顺序栈
{
int p = S->top;
printf("顺序栈元素为:");
if (StackEmpty_Sq(S))
{
printf("栈空!\n");
return;
}
while(p!=0)
printf("%d ",S->data[--p]);
printf("\n");
}
void showmenu()
{

printf("      --顺序栈基本运算演示--       \n");
printf("*      1---顺序栈的初始化         *\n");
printf("*      2---销毁顺序栈             *\n"); 
printf("*      3---清空顺序栈             *\n");
printf("*      4---判断顺序栈是否为空     *\n");
printf("*      5---判断顺序栈是否已满     *\n");
printf("*      6---入栈操作               *\n");
printf("*      7---出栈操作               *\n");
printf("*      8---取栈顶元素             *\n");
printf("*                                 *\n");
printf("*      0---退出                   *\n");
printf("请选择菜单号(0--8):"); 

}
void Stack_Sq()
{
char choice='N';
SElemType item;
SeqStack *S;
int flag=0; //是否创建好了顺序栈
while(choice!='0')
{
showmenu();
_flushall();
scanf("%c",&choice);
switch(choice)
{
case '1':
printf("初始化顺序栈操作\n");
if(InitStack_Sq(S))
{
printf("初始化成功!\n");
flag=1; //标志顺序表的存在
}
else
printf("初始化失败!\n");
break;
case'2':
if(flag) //顺序栈存在
{
DestroyStack_Sq(S);
flag=0; //顺序栈已删除
printf("顺序栈删除成功!\n");
}else{
printf("顺序栈不存在,操作失败!\n");
}
break;
case'3':
if(flag) //顺序栈存在
{
ClearStack_Sq(S);
printf("顺序栈清空成功!\n");
DispStack_Sq(S); //输出线性表
}else{
printf("顺序栈不存在,操作失败!\n");
}
break;
case'4':
if(flag) //顺序栈存在
{
printf("顺序栈%s。\n",StackEmpty_Sq(S)?"空":"不空");
DispStack_Sq(S); //输出线性表
}else{
printf("顺序栈不存在,操作失败!\n");
}
break;
case'5':
if(flag) //顺序栈存在
{
printf("顺序栈%s。\n",StackFull_Sq(S)?"空":"不空");
DispStack_Sq(S); //输出线性表
}else{
printf("顺序栈不存在,操作失败!\n");
}
break;
case'6':
if(flag) //顺序栈存在
{
printf("请输入要入栈的元素的值:");
scanf("%d",&item);
if(Push_Sq(S,item))
printf("该元素已入栈\n");
else
printf("栈满,入栈操作失败!\n");
DispStack_Sq(S); //输出线性表
}else{
printf("顺序栈不存在,操作失败!\n");
}
break;
case '7':
if(flag) //顺序栈存在
{
if(Pop_Sq(S,item))
printf("出栈元素为:%d。\n",item);
else
printf("栈空!\n");
DispStack_Sq(S);
}else{
printf("顺序栈不存在,操作失败!\n");
}
break;
case '8':
if(flag) //顺序栈存在
{
if(GetTop_Sq(S,item))
printf("栈顶元素为:%d。\n",item);
else
printf("栈空!\n");
DispStack_Sq(S); // 输出线性表
}else{
printf("顺序栈不存在,操作失败!\n");
}
break;
case '0':
printf("\n\t程序结束!\n");
DestroyStack_Sq(S);
break;
default:
printf("\n\t选择错误,请重新输入!\n");
break;
}
}
}
int main()
{
Stack_Sq();
return 0;
}

两个函数有问题:
销毁顺序栈函数:

//销毁顺序栈
int DestroyStack_Sq(SeqStack *&S)
{
    if(S){   //修改 if(!S)
        delete S;
        return OK;
    }
    return ERROR;
}

判断顺序栈是否为空函数:

//判断顺序栈是否为空
int StackEmpty_Sq (SeqStack *S)
{
    return S->top==0;//S->top=0; 修改
}


case '7':
if(flag) //顺序栈存在
{
if(Pop_Sq(S,item))       //这一行应该改成:if(Pop_Sq(S,&item))  
printf("出栈元素为:%d。\n",item);
else
printf("栈空!\n");
DispStack_Sq(S);
}else{
printf("顺序栈不存在,操作失败!\n");
}
break;