33,311
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#define Stack_Size 100
#define OK 1
#define ERROR 0
typedef struct Stack
{
char elem[Stack_Size];
int top;
}SqStack;
//SqStack *s;
int InitStack(SqStack **S) //创建一个空栈由指针S输出
{
if((*S=(SqStack *)malloc(sizeof(SqStack)))==NULL)
return ERROR;
(*S)->top=-1;
return OK;
}
int Push(SqStack *s, char e) //将元素e插入到栈S中,作为S的新栈顶
{
if(s->top >= Stack_Size-1) {
return ERROR;
} else {
s->top++;
s->elem[s->top] = e;
return OK;
}
}
int Pop(SqStack *s,char *e) //若栈S不为空,则删除栈顶元素
{
if(s->top < 0) {
return ERROR;
} else {
*e = s->elem[s->top];
s->top--;
return OK;
}
}
int GetTop(SqStack *s, char *e) //若栈S不为空,则返回栈顶元素
{
if(s->top==-1) {
return ERROR;
} else {
*e = s->elem[s->top];
return OK;
}
}
int StackEmpty(SqStack *s) //栈S为空时,返回为OK;非空时,返回为ERROR
{
if(s->top==-1)
return OK;
else
return ERROR;
}
void SetEmpty(SqStack *s) //将栈S的栈顶指针top置为-1
{
s->top=-1;
}
int getLengthStack(SqStack *S)//测栈长
{
if(S->top<0)
return ERROR; //判断是否为空栈,则长度是0
else
return S->top + 1; /* 栈长需要+1*/
}
int cpout(SqStack *s,int n ) //输出顺序栈
{
int i;
char m;
if(s->top<0)//判是否空栈
return ERROR;
else
{
for(i=1;i<=n;i++)
{
m = s->elem[s->top];
s->top--;
printf("%c",m);
}
}
printf("\n");
return OK;
}
int main()
{
int i,n;
char e,m;
//SqStack S;
SqStack *s; //定义一个栈,用指针的方式定义的
//s = &S; /* malloc 申请和直接定义两种选一 */
InitStack(&s);
printf("输入顺序栈长度:");
scanf("%d",&n);
printf("输入顺序栈元素:");
scanf("%c",&e);
for(i = 1; i <= n; i++)
{
scanf("%c", &e);
Push(s, e);
}
m = getLengthStack(s);
printf("当前栈长为:%d",m);
printf("\n");
printf("当前顺序栈为:");
cpout(s,n);
Pop(s,&e); //删除栈顶元素
printf("删除的栈顶元素为:%c",e);
printf("\n");
GetTop(s,&e);
printf("当前栈顶元素为:%c",e);
printf("\n");
printf("当前顺序栈为:");
cpout(s,n=n-1);
SetEmpty(s); //置空
m=StackEmpty(s); //判空
if(m) printf("置空操作成功!\n");
else printf("置空操作失败!\n");
return 0;
}
参考一下吧,栈初始化要么直接用S,结构体变量(不能直接调用初始化栈),要么用s结构体指针变量;
main函数里修改了部分函数参数,对比一下吧。
另外,注意scanf("%c", &e);输入时对于回车符处理的问题//请今后要用
char c;
scanf("%c",&c);
//时,都改为
char s[2];
char c;
scanf("%1s",s);
c=s[0];
//自动跳过一个或多个空格或Tab字符或回车换行,读取下一个字符。