【数据结构-栈】C语言实现链栈基本操作

C语言实现链栈基本操作

    • 链栈基本操作
      • 链栈储存结构
      • 初始化
      • 入栈
      • 出栈
      • 判断是否为空
      • 一次入栈n个元素
      • 遍历
      • 清空链栈
      • 测试代码整合

链栈基本操作

【数据结构-栈】C语言实现链栈基本操作_第1张图片

链栈储存结构

//链栈储存结构 
typedef struct StackNode
{
	ElemType data;
	struct StackNode *next;
}StackNode,*LinkStack;

初始化

//初始化
Status InitStack(LinkStack *S)
{
	*S = NULL;   //头指针置空 
	return OK;
}

入栈

//入栈
Status push(LinkStack *S,ElemType e)
{
	StackNode *p;   //开辟新结点 
	p = (StackNode *)malloc(sizeof(StackNode));
	p->data = e;    //元素赋值 
	p->next = *S;  //压栈(结点连接) 
	*S = p;   //头指针指向栈顶(指向新结点) 
	return OK;
}

出栈

//出栈
Status pop(LinkStack *S,ElemType *e)
{
	if(*S == NULL) return ERROR;   //空栈 
	StackNode *p;    //临时指针 
	*e = (*S)->data;     //数据出栈 
	p = *S;     //临时指针 
	*S = (*S)->next;  //栈顶指针指向上一个元素 
	free(p);   //释放临时指针指向的栈顶空间 
	return OK;
}

判断是否为空

//判断链栈是否为空
int isEmpty(LinkStack S)
{
	if(S == NULL) return TRUE;   //指向栈顶的指针为空 
	return FALSE;
}

一次入栈n个元素

//一次入栈n个元素(基于入栈函数)
void pushElems(LinkStack *S,int n)    //链栈基本上不会有满栈的情况,所以就不需要返回状态码了 
{
	int i;
	ElemType e;
	printf("请输入压栈的%d个元素:",n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&e);
		push(S,e);
	}
}

遍历

//遍历(遍历就不能基于出栈函数,因为出栈就等于删除栈空间)
Status showElems(LinkStack S)
{
	if(S == NULL) return ERROR;
	StackNode *p = S;
	printf("当前链栈:");
	while(p != NULL)
	{
		printf("%d ",p->data);
		p = p->next;
	}
	return OK;
}

清空链栈

//清空链栈 
Status clearStack(LinkStack *S)
{
	if(*S == NULL) return ERROR;
	ElemType e;
	while(*S != NULL)
		pop(S,&e);
	free(&e);
	return OK;
}

测试代码整合

#include 
#include 

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef int ElemType;
typedef int Status;

//链栈储存结构 
typedef struct StackNode
{
	ElemType data;
	struct StackNode *next;   //指向下一个同类型结点 
}StackNode,*LinkStack;

//初始化
Status InitStack(LinkStack *S)
{
	*S = NULL;   //头指针置空 
	return OK;
}

//入栈
Status push(LinkStack *S,ElemType e)
{
	StackNode *p;   //开辟新结点 
	p = (StackNode *)malloc(sizeof(StackNode));
	p->data = e;    //元素赋值 
	p->next = *S;  //压栈(结点连接) 
	*S = p;   //头指针指向栈顶(指向新结点) 
	return OK;
}

//出栈
Status pop(LinkStack *S,ElemType *e)
{
	if(*S == NULL) return ERROR;   //空栈 
	StackNode *p;    //临时指针 
	*e = (*S)->data;     //数据出栈 
	p = *S;     //临时指针 
	*S = (*S)->next;  //栈顶指针指向上一个元素 
	free(p);   //释放临时指针指向的栈顶空间 
	return OK;
}

//判断链栈是否为空
int isEmpty(LinkStack S)
{
	if(S == NULL) return TRUE;   //指向栈顶的指针为空 
	return FALSE;
}

//一次入栈n个元素(基于入栈函数)
void pushElems(LinkStack *S,int n)    //链栈基本上不会有满栈的情况,所以就不需要返回状态码了 
{
	int i;
	ElemType e;
	printf("请输入压栈的%d个元素:",n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&e);
		push(S,e);
	}
}

//遍历(遍历就不能基于出栈函数,因为出栈就等于删除栈空间)
Status showElems(LinkStack S)
{
	if(S == NULL) return ERROR;
	StackNode *p = S;
	printf("当前链栈:");
	while(p != NULL)
	{
		printf("%d ",p->data);
		p = p->next;
	}
	return OK;
}

//清空链栈 
Status clearStack(LinkStack *S)
{
	if(*S == NULL) return ERROR;
	ElemType e;
	while(*S != NULL)
		pop(S,&e);
	free(&e);
	return OK;
}

int main()
{
	LinkStack S;
	ElemType e;
	printf("-------已初始化链栈---------\n");
	InitStack(&S);
	printf("\n-------链栈是否为空?-------\n");
	printf("当前链栈情况:"); 
	if(isEmpty(S)) printf("空栈\n");
	else printf("非空栈\n");
	printf("\n--------一次压栈n个元素--------\n");
	pushElems(&S,5);
	printf("\n-------链栈是否为空?-------\n");
	printf("当前链栈情况:"); 
	if(isEmpty(S)) printf("空栈\n");
	else printf("非空栈\n");
	printf("\n---------遍历栈内元素---------\n");
	showElems(S);
	printf("\n\n---------清空链栈-----------\n");
	clearStack(&S);
	printf("当前链栈情况:"); 
	if(isEmpty(S)) printf("空栈\n");
	else printf("非空栈\n");
	printf("\n-----------100 压栈--------------\n");
	push(&S,100);
	printf("\n-----------出栈--------------\n");
	pop(&S,&e);
	printf("%d",e);
}

你可能感兴趣的:(数据结构,C语言,数据结构,栈,c语言)