#include<stdio.h>
struct stack
{
int buf[10];
int top;
};
void initStack(struct stack* p);
short push(struct stack* p,int* pdata);
short pop(struct stack* p,int* pdata);
short IsFull(struct stack* p);
short IsEmpty(struct stack* p);
void initStack(struct stack* p)//初始化
{
if(NULL!=p)//判断是否定义结构体
p->top=-1;//下标总是从0开始,没开始时为-1
}
short push(struct stack* p,int* pdata)//进栈
{
if(1==IsFull(p))//进栈前先判断栈是否为满,满了就无法继续进栈
return 0;//进栈失败返回0
else
{
p->buf[++p->top]=*pdata;//第一次进栈时top为-1,需先自加1,以后
//每次也都先自加1
return 1;//进栈成功返回1
}
}
short pop(struct stack* p,int* pdata)//出栈
{
if(1==IsEmpty(p))//出栈前先判断是否为空,为空则无元素可共出栈,出栈失败
return 0;//出栈失败返回0
else
{
*pdata=p->buf[p->top--];
return 1;//出栈成功返回1
}
}
short IsFull(struct stack* p)//是否为满
{
if(p->top==5)//定义buf[6],因此下标为5时,栈已满
return 1;//满了返回1
else
return 0;//没满返回0
}
short IsEmpty(struct stack* p)//是否为空
{
if(p->top==-1)//为空时没有元素,此时下标为-1
return 1;//为空返回1
else
return 0;//不为空返回0
}
int main()
{
struct stack s;
initStack(&s);//定义变量后先初始化
while(1)
{
printf("0、退出\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("请选择:");
int opt;
scanf("%d",&opt);
switch(opt)
{
case 0:
{
printf("欢迎再次使用\n");
return ;
}
case 1:
{
if(1!=IsEmpty(&s))//只有栈不为空时才需要初
//始化因为定义s后已初始化
{
initStack(&s);
printf("初始化成功\n");
}
else
printf("已处于初始化状态\n");
}break;
case 2:
{
int data;
printf("请输入需要进栈的数据:");
scanf("%d",&data);
if(1==push(&s,&data))
printf("进栈成功\n");
else
printf("进栈失败\n");
}break;
case 3:
{
int data;
if(1==pop(&s,&data))
printf("出栈成功,出栈的数据为:%d\n",data);
else
printf("栈内无元素可供出栈\n");
}break;
case 4:
{
printf("栈内元素的个数为:%d\n",s.top+1);
if(s.top>=0)
{
printf("栈内的元素分别为:");
int i=0;
for(;i<=s.top;i++)
printf("%d ",s.buf[i]);
printf("\n");
}
}break;
case 5:
{
if(s.top>0)//栈内元素大于2时才有次栈顶元素
printf("次栈顶元素为:%d\n",s.buf[s.top-1]);
else if(s.top==0)
printf("目前只有栈顶元素:%d\n",s.buf[s.top]);
else
printf("目前栈内无元素\n");
}break;
case 6://清空栈 初始化
{
if(1!=IsEmpty(&s))
{
initStack(&s);
printf("初始化成功\n");
}
else
printf("已处于初始化状态\n");
}break;
case 7:
{
if(1==IsEmpty(&s))
printf("栈为空\n");
else
printf("栈不为空\n");
}break;
case 8:
{
if(1==IsFull(&s))
printf("栈为满\n");
else
printf("栈不为满\n");
}break;
default:printf("输入错误\n");
}
}
}
硕彦博创学习记录——2018.7.25(顺序栈)
猜你喜欢
转载自blog.csdn.net/yangwenxiao123456/article/details/81209660
今日推荐
周排行