链式栈C语言实现

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_44833327/article/details/102690329

代码的关键在于“先进后出”,本代码实现了求链栈的长度 ,取栈顶,进栈,出栈,遍历栈。
在这里插入图片描述
在这里插入图片描述
代码如下

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define true1
#define ok 1
#define error 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define maxn 100
#define num 10
typedef struct{
	int *base;
	int *top;
	int stacksize;
}stack; 
//创建个空链栈 
int InitStack(stack &S){
	if(S.base!=NULL){
		return error;
	}	
	S.base = (int *)malloc(maxn*sizeof(int));
	if(!S.base)
		exit(OVERFLOW);
	S.top = S.base;
	S.stacksize = maxn; 
	return ok;
}
//求链栈的长度 
int StackLength(stack S){
	if(S.base==NULL)
		return INFEASIBLE;
	if(S.top==S.base)
		return 0;
	int i = 0;
	int *p=S.top;
	while(p!=S.base){
		int e = *p;
		p--;
		i++;
	} 
	return i;
}
//取栈顶 
int GetTop(stack S,int &e){
	if(S.top==S.base)
		return error;
	e = *--S.top;
	return ok;
}
//进栈 
int Push(stack &S,int &e){
	if(S.top-S.base>=S.stacksize){
		S.base = (int *)realloc(S.base,(S.stacksize+num)*sizeof(int));
		if(!S.base)
			exit(OVERFLOW);
		S.top = S.base + S.stacksize;
		S.stacksize+=num;
	}
	*S.top++=e;
	return ok;
}
//出栈 
int Pop(stack &S,int &e){
	if(S.top==S.base)
	return error;
	printf("%d\n",e = *--S.top) ;
	return ok;
}
//遍历栈 
int StackTreaverse(stack S){
	if(S.base==NULL)
		return INFEASIBLE;
	if(S.base==S.top){
		printf("栈空");
		return ok;
	} 
	int *p = S.top;
	int i=1;
	int e;
	while(p!=S.base){
		if(i!=1)
			printf("\n"); 
		e = *--p;
		printf("距栈顶元素长为%-3d的元素为:   %d",i++,e);
	} 
	return ok;
}

int main(){
	stack S;
	S.base=NULL;
	int e,n;
	InitStack(S);
	printf("创建空栈成功\n"); 
	StackLength(S);
	printf("请输入几个数进栈\n");
	scanf("%d",&n);
	printf("请输入入栈的元素的值:\n");
	for(int i=0;i<n;i++)
	{
		scanf("%d",&e);
		Push(S,e);
	}
	printf("取栈顶得元素\n");
	printf("%d\n",GetTop(S,e));
	printf("弹出栈首: ");
	Pop(S,e);
	printf("更新栈\n");
	StackTreaverse(S);
	 return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_44833327/article/details/102690329