
"stdio.h"
#define
Stack_Size
100
typedef
int
StackElemType
typedef
struct//结构体定义
{
StackElemType
elem[Stack_Size]
int
top
}SeqStack
void
InitStack(SeqStack
*S)//初始化栈
{
S->top=-1
}
int
IsEmpty(SeqStack
*S)//判断是否为空
{
if(S->top
==-1)
return
1
else
return
0
}
int
IsFull(SeqStack
*S)//判断是否满栈
{
if(S->top==Stack_Size-1)
return
1
else
return
0
}
int
Push(SeqStack
*S,StackElemType
x)//入栈
{
if(S->top==Stack_Size-1)
{
printf("栈满了\n")
return
0
}
S->top++
S->elem[S->top]=x
return
1
}
int
Pop(SeqStack
*S,StackElemType
*x)//出栈
{
if(S->top
==-1)
{
printf("栈空\n")
return
0
}
*x=S->elem[S->top]
S->top--
return
1
}
int
GetTop(SeqStack
*S,StackElemType
*x)//取栈顶元素
{
if(S->top==-1)
{
printf("栈空\n")
return
0
}
*x=S->elem[S->top]
printf("\n")
return
1
}
void
PrintStack(SeqStack
*S)//打印出结果
{
int
i=S->top
while(i!=-1)
{
printf("***********
\n")
printf("
%d*******%d
\n",i+1,S->elem[i])
printf("**************\n")
i--
}
}
void
main()
{
SeqStack
S
StackElemType
pushdata,popdata,topdata
int
flag=1,i
InitStack(&S)
while(flag)
{
printf("----菜单----\n")
printf("1:
入栈\n")
printf("2:
出栈\n")
printf("3:
栈顶元素\n")
printf("4:
退出\n")
scanf("%d",&i)
switch(i)
{
case
1:printf("请输入要压入的元素\n")
scanf("%d",&pushdata)
Push(&S,pushdata)
printf("压入后的栈:\n")
PrintStack(&S)
break
case
2:Pop(&S,&popdata)
printf("d出的元素为:
%d",popdata)
printf("d出后的栈:\n")
PrintStack(&S)
break
case
3:GetTop(&S,&topdata)
printf("栈顶元素为
:
%d",topdata)
break
case
4:flag=0
break
}
}
}
您的程序有比较多的地方有问题,例举几个:1)case '@': ClearStack(S)break清空栈后,想再不初始化就再使用?top指针其实编程空指针了。
2)什么情况下用变量的使用问题,typedef struct{。。。}SqStack,*S中的*S,InitStack(S)把S当做全局指针?基础要加强。
3)代码修正如下,可以正确运行。
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef char Status
typedef char SElemType
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct{
SElemType *base
SElemType *top
int stacksize
}SqStack
SqStack S
Status InitStack()
{
S.base = (SElemType * )malloc(STACK_INIT_SIZE * sizeof(SElemType))
if(!S.base)
exit(OVERFLOW)
S.top = S.base
S.stacksize=STACK_INIT_SIZE
return OK
}//InintStack
Status GetTop(SElemType *e)
{
if(S.top==S.base) return ERROR
*e=*(S.top-1)
return OK
}//GrtTop
Status Push(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
}//Push
SElemType Pop()
{
SElemType ch
if(S.top==S.base)
{
return ERROR
}
ch=*(--S.top)
return ch
}//Pop
Status ClearStack()
{
S.top=0
return OK
}//ClearStack
Status DestroyStack()
{
S.top=0
return OK
}
void LineEdit()
{
InitStack()
char ch
ch=getchar()
while(ch!='\n')
{
while(ch!='\n')
{
switch(ch)
{
case '#': printf("\n出栈%c",Pop())
break
//case '@': ClearStack()
// break
default : Push(ch)
break
}
ch=getchar()
}
}
DestroyStack()
}
int main()
{
LineEdit()
return 0
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)