数据结构-栈的实现(C语言)

大家好呀,今天我们来学习一下栈,并且完成栈的实现。

栈是一种特殊性的线性表,他只允许在固定的一端进行插入和删除元素操作。其中进行数据插入和删除的一端称为栈顶,另一端为栈底。栈中的数据元素遵行先入后出LIFO(Last In First Out)原则。

过程如下:

栈可以使用数组或者链表实现,相对而言,数组的结构实现会更优。因为数组的尾插代价较小。

了解了上述的内容之后,我们来实现栈。

首先我们创建一个工程,组成为:源文件:Stack.c和Test.c,头文件:Stack.h。

Stack.h:声明函数和应用库函数

Stack.c:存放函数内容

Test.c:调试内容

接下来我们来构建栈的结构体,我们的栈需要一个指针指向我们的数据,设定一个整型:top代表我们的栈顶数据。设定一个整型:capacity来记录我们当前的最大容量。

接下来我们需要完成几个基本功能函数:栈的初始化(StackInit),入栈(StackPush),出栈(StackPop), 栈的销毁(StackDestory)。

按照顺序我们一起来逐一实现:

栈的初始化(StackInit):初始化中,我们需要将我们的数据指针指向NULL,将我们的top(与当前栈中的个数相当)和capacity设置为0。

入栈(StackPush):我们在入栈时需要先判断我们容量是否充足,所以我们将top和capacity进行比较(我们的a是一个数组指针,top是栈顶的下标)。如果我们的top==capacity,那么我们需要进行扩容操作。

判断容量是否充足之后我们就进行入栈操作:我们将栈顶的元素设置为新的数据,然后将我们的top++。

出栈(StackPop):我们只需要将top--,这样后续的插入会将其覆盖。

栈的销毁(StackDestory):我们将a指针指向的区域释放,然后置空即可,然后将top和capacity 重新设置为0。

完成上述基本功能函数之后,我们也就完成了一个栈的构建。接下来我们来补充几个功能函数: 获取栈顶元素 (StackTop),获取栈中的有效元素个数(StackSize),检查栈是否为空,如果为空返回非零结果,如果不为空返回0 (StackEmpty)。

 获取栈顶元素 (StackTop):我们直接返回我们的top-1元素即可。

获取栈中的有效元素个数(StackSize):我们的top就是我们当前栈中的元素个数,所以返回top即可。

检查栈是否为空,如果为空返回非零结果,如果不为空返回0 (StackEmpty):我们根据top判断是否为0。

本期栈内容到此我们就完成啦,希望各位能有所收获。欢迎各位大佬指点,纠正错误。代码如下:

//Stack.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SDataType;
typedef struct Stack
{
	SDataType* a;
	int top;
	int capacity;
}Stack;

//栈初始化
void StackInit(Stack* ps);
//入栈
void StackPush(Stack* ps, SDataType x);
//出栈
void StackPop(Stack* ps);
//栈的销毁
void StackDestory(Stack* ps);
// 获取栈顶元素 
SDataType StackTop(Stack* ps);
//获取栈中的有效元素个数
int StackSize(Stack* ps);
//检查栈是否为空,如果为空返回非零结果,如果不为空返回0
int StackEmpty(Stack* ps);
//Stack.c
#define _CRT_SECURE_NO_WARNINGS
#include"Stack.h"
//栈初始化
void StackInit(Stack* ps)
{
	assert(ps);
	ps->a = NULL;
	ps->top = 0;
	ps->capacity = 0;
}
//入栈
void StackPush(Stack* ps, SDataType x)
{
	assert(ps);
	if (ps->top == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		SDataType* tmp = (SDataType*)realloc(ps -> a, sizeof(SDataType)*newcapacity);
		if (tmp == NULL)
		{
			perror("realloc tmp");
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity = newcapacity;
	}
	ps->a[ps->top] = x;
	ps->top++;
}
//出栈
void StackPop(Stack* ps)
{
	ps->top--;
}
//栈的销毁
void StackDestory(Stack* ps)
{
	free(ps->a);
	ps->a = NULL;
	ps->top = 0;
	ps->capacity = 0;
}
// 获取栈顶元素 
SDataType StackTop(Stack* ps)
{	
	return ps->a[ps->top - 1];
}
//获取栈中的有效元素个数
int StackSize(Stack* ps)
{
	return(int)ps->top;
}
//检查栈是否为空,如果为空返回非零结果,如果不为空返回0
int StackEmpty(Stack* ps)
{
	if (ps->top == 0)
	{
		return -1;
	}
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值