硕彦博创学习记录——2018.7.25(顺序栈)

#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");
		}
	}
}

猜你喜欢

转载自blog.csdn.net/yangwenxiao123456/article/details/81209660
今日推荐