栈的链式存储(C语言实现)

链栈:

有两种做法,一种是函数不返回指针,但是需要运用二重指针。另一种就是有返回值的函数,此处采用的是返回指针的做法。

函数:

构造链栈 

//构造栈 
LinkStack InitStack(LinkStack S)
{
	S = NULL;
	return S;
}

压入栈

//压入栈 
LinkStack Push(LinkStack S, ElementType* e)
{
	LinkStack p;
	p = (LinkStack)malloc(sizeof(StackNode));
	p->data=*e;      //赋值
	p->next=S;      //压入栈顶
	S=p;
	return S;
}

弹出栈

//弹出栈 
LinkStack Pop(LinkStack S, ElementType* e)
{
	LinkStack p;
	if (S == NULL) return ERROR;
	*e = S->data;
	p = S;
	S = S->next;
	free(p);
	return S;
}

取栈顶元素

//取栈顶元素 
void GetTop(LinkStack S, ElementType* e)
{
	
	if (S!=NULL) 
	*e = S->data;
}

调用压入栈函数

//调用压入栈函数 
LinkStack Push_Stack(LinkStack S)
{
	int num, e;
	printf("请输入入栈元素个数:\n");
	scanf("%d", &num);
	printf("请输入入栈元素:\n");
	for (int i=0; i<num; i++)
	{
		scanf("%d", &e);
		S = Push(S,&e);
		printf("%d已入栈\n", e);
	}
	return S;
 } 

调用弹出栈函数

//调用弹出函数 
LinkStack Pop_Stack(LinkStack S)
{
 	int num, e;
 	printf("请输入出栈元素个数:\n");
	scanf("%d", &num);
	for (int i=0; i<num; i++)
	{	
		if (S != NULL)
		{
			S = Pop(S,&e);
			printf("%d已出栈\n", e);
		}
		else {
			printf("栈已空\n"); 
			break; }
	}
	return S;
	
}

调用取栈顶元素函数

//调用取栈顶元素函数 
void GetTop_Stack(LinkStack S)
{
 	int e, flag;
 	if (S != NULL) 
	{
		GetTop(S,&e);
		printf("栈顶元素为%d\n", e);
	}
 	else printf("栈已空\n");
}

菜单

//菜单 
void menu()
{
   printf("********1.入栈      2.出栈*********\n");
   printf("********3.取栈顶    4.退出*********\n");
}

主函数 

//主函数 
int main()
{
	int n;

	LinkStack S;
	S = InitStack(S);
	

	while (1)
	{
		menu();
		scanf("%d", &n);
		switch(n)
		{
			case 1: S = Push_Stack(S); break;
			case 2: S = Pop_Stack(S); break;
			case 3: GetTop_Stack(S); break;
			case 4: exit(OVERFLOW);
		}
		
	}
	return 0;
}

完整代码

#include <Stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
#define ERROR 0
#define OVERFLOW -1
#define Status int
#define OK 1
#define ElementType int

typedef struct StackNode{
	ElementType data;
	struct StackNode *next;
}StackNode, *LinkStack;

//构造栈 
LinkStack InitStack(LinkStack S)
{
	S = NULL;
	return S;
}

//压入栈 
LinkStack Push(LinkStack S, ElementType* e)
{
	LinkStack p;
	p = (LinkStack)malloc(sizeof(StackNode));
	p->data=*e;      //赋值
	p->next=S;      //压入栈顶
	S=p;
//	printf("%d\n", S->data);

	return S;
}

//弹出栈 
LinkStack Pop(LinkStack S, ElementType* e)
{
	LinkStack p;
	if (S == NULL) return ERROR;
	*e = S->data;
//	printf("S->data 的值是 %d\n", S->data);
//	printf("e 的值是 %d\n", *e);
	p = S;
	S = S->next;
	free(p);
	return S;
}

//取栈顶元素 
void GetTop(LinkStack S, ElementType* e)
{
	
	if (S!=NULL) 
	*e = S->data;
}

//调用压入栈函数 
LinkStack Push_Stack(LinkStack S)
{
	int num, e;
	printf("请输入入栈元素个数:\n");
	scanf("%d", &num);
	printf("请输入入栈元素:\n");
	for (int i=0; i<num; i++)
	{
		scanf("%d", &e);
		S = Push(S,&e);
//		printf("S->data 的值是 %d\n", S->data);
		printf("%d已入栈\n", e);
	}
	return S;
 } 
 
//调用弹出函数 
LinkStack Pop_Stack(LinkStack S)
{
 	int num, e;
 	printf("请输入出栈元素个数:\n");
	scanf("%d", &num);
	for (int i=0; i<num; i++)
	{	
		if (S != NULL)
		{
			S = Pop(S,&e);
			printf("%d已出栈\n", e);
		}
		else {
			printf("栈已空\n"); 
			break; }
	}
	return S;
	
}

//调用取栈顶元素函数 
void GetTop_Stack(LinkStack S)
{
 	int e, flag;
// 	printf("%d", S);
 	if (S != NULL) 
	{
//		printf("123\n");
		GetTop(S,&e);
		printf("栈顶元素为%d\n", e);
	}
 	else printf("栈已空\n");
}
 
//菜单 
void menu()
{
   printf("********1.入栈      2.出栈*********\n");
   printf("********3.取栈顶    4.退出*********\n");
}

//主函数 
int main()
{
	int n;

	LinkStack S;
	S = InitStack(S);
	

	while (1)
	{
		menu();
		scanf("%d", &n);
		switch(n)
		{
			case 1: S = Push_Stack(S); break;
			case 2: S = Pop_Stack(S); break;
			case 3: GetTop_Stack(S); break;
			case 4: exit(OVERFLOW);
		}
		
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_46272577/article/details/111166109