顺序栈的基本操作(C语言实现,简单易懂!)

一、学习内容

1、 顺序栈初始化

2、 顺序栈的入栈

3、 顺序栈的出栈

4、 顺序栈取栈顶

5、 顺序栈的清空

6、 顺序栈的销毁

7、 顺序栈的判空

8、 顺序栈的判满

9、所有元素出栈

10、求栈元素个数

二、总代码

/*
顺序栈:
栈的操作都在栈顶进行,特点是先进后出 
*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef int StackEntry;

typedef enum status
{
	success,fail
}Status;

typedef struct stack
{
	int top;
	int maxsize;
	StackEntry *entry;//动态分配 
}Stack,*StackPtr;

Status Stack_Init(StackPtr s,int size); 
Status Stack_Push(StackPtr s,StackEntry item);
Status Stack_Pop(StackPtr s,StackEntry *item);
Status Stack_Top(StackPtr s,StackEntry *item);
bool Stack_Clear(StackPtr s);
Status Stack_Destroy(StackPtr s);
bool Stack_Empty(StackPtr s);
bool Stack_Full(StackPtr s);
void Stack_All(StackPtr s);
Status Stack_Check(Status sInit);

/*一、初始化*/
Status Stack_Init(StackPtr s,int size)
{
	Status outcome=fail;
	s->entry=(StackEntry *)malloc(size*sizeof(StackEntry));
	if(s->entry!=NULL)
	{
		s->top=-1;//空栈
		s->maxsize=size;
		outcome=success;
	}
	return outcome;
}

/*二、入栈*/
Status Stack_Push(StackPtr s,StackEntry item)
{
	Status outcome=success;
	if(Stack_Full(s)==1)
	{
		outcome=fail;
	}
	else
	{
		s->top++;
		s->entry[s->top]=item;
	}
	return outcome;
}

/*三、出栈*/
Status Stack_Pop(StackPtr s,StackEntry *item)
{
	Status outcome=success;
	if(Stack_Empty(s)==true)
	{
		outcome=fail;	
	}	
	else
	{
		*item=s->entry[s->top];
		--s->top;
	}
	return outcome; 
} 	

/*四、取栈顶元素*/
Status Stack_Top(StackPtr s,StackEntry *item)
{
	Status outcome=success;
	if(Stack_Empty(s)==1)
	{
		outcome=fail;
	}
	else
	{
		*item=s->entry[s->top];
	}
	return outcome;
}

/*五、清空*/ 
bool Stack_Clear(StackPtr s)
{
	s->top=-1;
	return true;
}
/*六、销毁*/ 
Status Stack_Destroy(StackPtr s)
{
	Status outcome=fail;
	if(s->entry!=NULL)
	{
		free(s->entry);
		s->entry=NULL;
		s->top=-1;
		outcome=success;
	}
	return outcome;
}

/*七、判栈空*/
bool Stack_Empty(StackPtr s)
{
	return (s->top<=-1);	
}

/*八、判栈满*/
bool Stack_Full(StackPtr s)
{
	return (s->top>=s->maxsize-1);//如果栈满则返回1 
}

/*九、所有元素出栈*/
void Stack_All(StackPtr s)
{
	int item,i;
	if(Stack_Empty(s)==true)printf("栈下溢!\n");
	else
	{
		printf("从栈顶依次向底的元素为:\n");
		for(i=s->top;i>=0;i--)
		{
			Stack_Pop(s,&item);
			printf("%d\n",item);
		}		
	}

	
} 

/*十、检查是否初始化*/
Status Stack_Check(Status sInit)
{
	if(sInit==success)return success;
	else return fail;	
} 

int main()
{
	int number,i,n,size=0;
	StackEntry item;
	Status sInit=fail,sOther=fail;
	Stack s;
	printf("****************1、 顺序栈初始化\t"); 
	printf("2、 顺序栈的入栈****************\n");
	printf("****************3、 顺序栈的出栈\t"); 
	printf("4、 顺序栈取栈顶****************\n");
	printf("****************5、 顺序栈的清空\t");
	printf("6、 顺序栈的销毁****************\n");
	printf("****************7、 顺序栈的判空\t");
	printf("8、 顺序栈的判满****************\n");
	printf("****************9、 展示菜单选项\t");
	printf("10、所有元素出栈****************\n"); 
	printf("****************11、栈元素的个数\t");
	printf("0、 结束该程序******************\n");
	while(1)
	{
		printf("选项:");
		scanf("%d",&number); 
		switch(number)
		{
			case 1: {
						printf("请输入栈顶最大元素个数:");
						scanf("%d",&size); 
						sInit=Stack_Init(&s,size);
						if(sInit==success)  printf("初始化成功!\n");
						else if(sInit==fail)printf("初始化失败!\n");
						break;
					}
					
			case 2: {
						if(Stack_Check(sInit)==fail)printf("请先初始化再进行其他操作!\n");
						else
						{
							printf("请输入入栈元素:");
							scanf("%d",&item);
							sOther=Stack_Push(&s,item);
							if(sOther==success)printf("入栈成功!\n");
							else printf("栈上溢!\n");
						} 
						break;
					}
			
			case 3 :{
						if(Stack_Check(sInit)==fail)printf("请先初始化再进行其他操作!\n");
						else
						{
							sOther=Stack_Pop(&s,&item);				
							if(sOther==success)printf("出栈元素为:%d\n",item);
							else printf("栈下溢!\n");			
						} 						
						break;
					}
			
			case 4 :{
						if(Stack_Check(sInit)==fail)printf("请先初始化再进行其他操作!\n");
						else
						{
							sOther=Stack_Top(&s,&item);
							if(sOther==success)printf("栈顶元素为:%d\n",item); 
							else printf("栈下溢!\n");
						} 						
						break;
					}
			
			case 5 :{
						if(Stack_Check(sInit)==fail)printf("请先初始化再进行其他操作!\n");
						else
						{
							if(Stack_Clear(&s)==true)printf("清空成功!\n");
							else printf("清空失败!\n");
						} 						
						break;
					}
			
			case 6 :{
						if(Stack_Check(sInit)==fail)printf("请先初始化再进行其他操作!\n");
						else
						{
							sOther=Stack_Destroy(&s);
							if(sOther==success)
							{
								printf("销毁成功!\n"); 
								sInit=fail;	
							}
							else printf("销毁失败!\n");
						} 					
						
						break;
					}
							
			case 7 :{
						if(Stack_Check(sInit)==fail)printf("请先初始化再进行其他操作!\n");
						else
						{
							if(Stack_Empty(&s)==1)printf("栈空!\n");
							else printf("栈未空!\n");
													
						} 
						break;	
					}
					
			case 8 :{
						if(Stack_Check(sInit)==fail)printf("请先初始化再进行其他操作!\n");
						else
						{
							if(Stack_Full(&s)==1)printf("栈满!\n");
							else printf("栈未满!\n"); 
														
						} 				
						break;
					}
			 
			case 9 :{
						printf("------------------------------------------------------------------------\n");
						printf("****************1、 顺序栈初始化\t"); 
						printf("2、 顺序栈的入栈****************\n");
						printf("****************3、 顺序栈的出栈\t"); 
						printf("4、 顺序栈取栈顶****************\n");
						printf("****************5、 顺序栈的清空\t");
						printf("6、 顺序栈的销毁****************\n");
						printf("****************7、 顺序栈的判空\t");
						printf("8、 顺序栈的判满****************\n");
						printf("****************9、 展示菜单选项\t");
						printf("10、所有元素出栈****************\n"); 
						printf("****************11、栈元素的个数\t");
						printf("0、 结束该程序******************\n");
						printf("------------------------------------------------------------------------\n");						
						break;
					}
			
			case 10:{
						if(Stack_Check(sInit)==fail)printf("请先初始化再进行其他操作!\n");
						else
						{
							Stack_All(&s);
						} 						
						break;
					}
			
			case 11:{
						printf("栈元素个数:%d\n",s.maxsize); 
						break;
					}
								
			case 0 :{
						printf("再见,祝您生活幸福愉快!");
						return 0; 
					}
					
			default:{
						printf("请输入0~11内的整数!\n");
						break;
					}			
		}	
	} 
}
/*
检查语句:
						if(Stack_Check(sInit)==fail)printf("请先初始化再进行其他操作!\n");
						else
						{
							
						} 
*/

猜你喜欢

转载自blog.csdn.net/m0_53392188/article/details/120601308
今日推荐