【数据结构】栈的实现(链式栈)

栈的实现(链式栈)

首先新建一个工程:

Stack.h(链式栈的类型定义、接口函数声明、引用的头文件)
Stack.c(链式栈接口函数的实现)
test.c(主函数、测试栈各个接口功能)

完整的代码放在后面(包括测试代码),这里就不会展示测试的效果图。大家可以自己别敲边按测试代码测试。图解会写的很详细的,么么😙

栈的定义

typedef int ElemType;		

/* 链栈结点结构 */
typedef struct StackNode
{
	ElemType data;
	struct StackNode* next;
}StackNode;

/* 链栈结构 */
typedef struct
{
	StackNode* top;
	int count;
}LinkStack;

初始化栈

在这里插入图片描述

// 初始化栈
LinkStack* Init()
{
	// 注意要给链栈分配内存
	LinkStack* p = (LinkStack*)malloc(sizeof(LinkStack));
	if (p == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}

	p->top = NULL; // 链栈的空其实就是 top=NULL 的时候
	p->count = 0;

	return p;
}

进栈

在这里插入图片描述

// 进栈
void push(LinkStack* stack, ElemType x)
{
	assert(stack);

	StackNode* s = (StackNode*)malloc(sizeof(StackNode));
	if (s ==NULL)
	{
		perror("malloc fail");
		exit(-1);
	}

	s->data = x;
	s->next = stack->top; 
	stack->top = s; 
	stack->count++;
}

判断是否为空栈

这里可以用count是否等于0判断,也可以用stack->top=NULL来判断都可以。

// 判断是否为空栈
bool isEmpty(LinkStack* stack)
{
	assert(stack);

	return  stack->count == 0;
}

出栈

在这里插入图片描述

// 出栈
void pop(LinkStack* stack)
{
	assert(stack);

	if (isEmpty(stack))
		return ;

	StackNode* q = stack->top;
	stack->top = stack->top->next;
	free(q); 
	q = NULL;
	stack->count--;

}

销毁栈

这里需要二级指针才能置空stack,但是我为了整体的美观,我们这里每次使用完后,在函数外面主动置空 plist。

// 销毁栈
void destroy(LinkStack* stack)
{
	assert(stack);

	StackNode* p = stack->top;
	StackNode* q;

	while (p)
	{
		q = p;
		p = p->next;
		free(q);
	}

	stack->count = 0;
	q = NULL;
	free(stack);
	//stack = NULL;
	//需要主动释放置空,不然要使用二级指针
	

}

获取栈顶元素

// 获取栈顶元素
ElemType getTop(LinkStack* stack)
{
	assert(stack);

	if (stack->top == NULL)
		exit(-1);
	else
	   return 	stack->top->data;

}

获取栈的长度

// 获取栈的长度
int getLength(LinkStack* stack)
{
	assert(stack);
	return stack->count;
}

栈的打印

同顺序栈一样写在测试test.c文件中。

完整代码(包括测试代码)

Stack.h

#pragma once
#include<stdio.h>	
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>


typedef int ElemType;		

/* 链栈结点结构 */
typedef struct StackNode
{
	ElemType data;
	struct StackNode* next;
}StackNode;

/* 链栈结构 */
typedef struct
{
	StackNode* top;
	int count;
}LinkStack;



// 初始化栈
LinkStack* Init();
// 进栈
void push(LinkStack* stack, ElemType x);
// 判断是否为空栈
bool isEmpty(LinkStack* stack);
// 出栈
void pop(LinkStack* stack);
// 销毁栈
void destroy(LinkStack* stack);
// 获取栈顶元素
ElemType getTop(LinkStack* stack);
// 获取栈的长度
int getLength(LinkStack* stack);

Stack.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"Stack.h"

// 初始化栈
LinkStack* Init()
{
	// 注意要给链栈分配内存
	LinkStack* p = (LinkStack*)malloc(sizeof(LinkStack));
	if (p == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}

	p->top = NULL; // 链栈的空其实就是 top=NULL 的时候
	p->count = 0;

	return p;
}

// 进栈
void push(LinkStack* stack, ElemType x)
{
	assert(stack);

	StackNode* s = (StackNode*)malloc(sizeof(StackNode));
	if (s ==NULL)
	{
		perror("malloc fail");
		exit(-1);
	}

	s->data = x;
	s->next = stack->top; 
	stack->top = s; 
	stack->count++;
}

// 判断是否为空栈
bool isEmpty(LinkStack* stack)
{
	assert(stack);

	return  stack->count == 0;
}

// 出栈
void pop(LinkStack* stack)
{
	assert(stack);

	if (isEmpty(stack))
		return ;

	StackNode* q = stack->top;
	stack->top = stack->top->next;
	free(q); 
	q = NULL;
	stack->count--;

}



// 销毁栈
void destroy(LinkStack* stack)
{
	assert(stack);

	StackNode* p = stack->top;
	StackNode* q;

	while (p)
	{
		q = p;
		p = p->next;
		free(q);
	}

	stack->count = 0;
	q = NULL;
	free(stack);
	//stack = NULL;
	//需要主动释放置空,不然要使用二级指针
	

}

// 获取栈顶元素
ElemType getTop(LinkStack* stack)
{
	assert(stack);

	if (stack->top == NULL)
		exit(-1);
	else
	   return 	stack->top->data;

}

// 获取栈的长度
int getLength(LinkStack* stack)
{
	assert(stack);
	return stack->count;
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"Stack.h"


int main()
{
	LinkStack* plist = Init();
	push(plist, 1);
	push(plist, 2);
	push(plist, 3);
	push(plist, 4);
	push(plist, 5);

	while (!isEmpty(plist))
	{
		printf("%d ", getTop(plist));
		pop(plist);

	}
	printf("\n");
	int len=getLength(plist);
	printf("%d\n", len);

	bool b = isEmpty(plist);
	if (b)
	{
		printf("true\n");

	}
	else
	{
		printf("false\n");
	}
	destroy(plist);
	//主动置空
	plist = NULL;
	return 0;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值