栈是一种被限制在只能在表的一端进行插入和删除运算的线性表。 (局部变量是用栈来保存的)
#include <stdio.h>
#define STACKSIZE 100//栈的最大容量
typedef char DataType;//保存的数据类型
typedef struct
{
DataType data [STACKSIZE];
int nTop;//栈顶指针。
}SepStack;//SepStack不是变量,是无名结构的别名。
void InitSack(SepStack *s);
int StackEmpty(SepStack *s);
int StackFull(SepStack *s);
void Push(SepStack *s,DataType x);
DataType *Pop (SepStack *s);
int main(int argc, const char * argv[])
{
SepStack stack;
InitSack(&stack);
StackEmpty(&stack);
StackFull(&stack);
char arr = '\0';
printf("请输入要进栈的字符:\n");
scanf("%c",&arr);
Push(&stack, arr);
getchar();//读取输入字符后面的回车。
printf("请输入要进栈的字符:\n");
scanf("%c",&arr);
Push(&stack, arr);
printf("\n");
char pop=*(Pop(&stack));
printf("出栈的字符是:%c\n",pop);
getchar();
printf("请输入要进栈的字符:\n");
scanf("%c",&arr);
Push(&stack, arr);
getchar();
printf("请输入要进栈的字符:\n");
scanf("%c",&arr);
Push(&stack, arr);
printf("\n");
for (int i=0; i<3; i++)
{
char pop=*(Pop(&stack));
printf("出栈的字符是:%c\n",pop);
}
return 0;
}
void InitSack(SepStack *s)//初始化一个栈
{
s->nTop=-1;
}
int StackEmpty(SepStack *s)//判断栈空
{
return s->nTop==-1;
}
int StackFull(SepStack *s)//判断栈满。
{
return s->nTop==STACKSIZE-1;
}
void Push(SepStack *s,DataType x)//进栈。
{
if (StackFull(s))//判断栈是否满。
{
printf("栈已满");
return ;
}
s->data[++s->nTop]=x;
printf("进栈的字符是:%c\n",s->data[s->nTop]);
}
DataType *Pop (SepStack *s)//退栈。
{
if (StackEmpty(s))
{
printf("是空栈");
return NULL;
}
return &s->data[s->nTop--];//栈顶元素返回后将栈顶指针减1.
}
DataType *StackTop(SepStack *s)//取栈顶元素。
{
if (StackEmpty(s))
{
printf("是空栈");
return NULL;
}
return &s->data[s->nTop];
}