C语言——栈的实现

栈(Stack)是一种基于先进后出(LIFO)原则的数据结构,类似于我们平常堆放书籍或者盘子的方式。

栈通常是从高地址向低地址增长的,也就是说,栈顶位于较高的内存地址,而栈底位于较低的内存地址。这种结构通常被称为"向下生长的栈"或者"递减栈"。

下面是入栈的示意图,出栈可以理解为是入栈的逆过程。

按照我们现有的知识来看,我们可以用顺序表也可以使用链表,那么对于栈来说,删除和增加尾部元素比较频繁因为是先入先出,并且访问简单,结构简单,所以我们可以考虑使用顺序表(当然也可以使用链表,这里用顺序表举例)。

首先是栈的创建和初始化,销毁函数:

cpp 复制代码
struct Stacklist {
	char* val;
	int size;
	int cap;
};
void StackInit(struct Stacklist* stack){
	stack->cap = 0;
	stack->size = 0;
	stack->val = NULL;
}
void StackDes(struct Stacklist* stack) {
	free(stack->val);
	stack->val = NULL;
}

这里的 size 是Stack已有元素的个数,cap 是Stack的容量,val 是储存的字符。这三个函数还是比较容易理解的。

接下来是栈的空间检查和入栈函数(尾插函数,因为是先入后出,后入先出):

cpp 复制代码
void StackCheck(struct Stacklist* stack) {
	if (stack->cap == stack->size) {
		if (stack->cap == 0) {
			stack->cap = 4;
			stack->val = (char*)malloc(sizeof(char) * stack->cap);
		}
		else {
			stack->val = (char*)realloc(stack->val,sizeof(char)*stack->cap*2);
			stack->cap = stack->cap * 2;
		}
	}
}
void StackPush(struct Stacklist* stack,char a) {
	StackCheck(stack);
	(stack->val)[stack->size] = a;
	stack->size++;
}

在 StackCheck 函数中,如果cap和size都为空,那么就默认创建4个char字符空间给stack->val,

如果cap和size虽然相等但都不为0,那么就默认扩容两倍,stack->val = (char*)realloc(stack->val,sizeof(char)*stack->cap*2);

在StackPush入栈函数中,先检查空间是否足够,然后赋值,size++,

接下来是出栈函数:

cpp 复制代码
char StackPop(struct Stacklist* stack) {
	stack->size--;
	return (stack->val)[stack->size];
}

让size--,返回 char 字符,这里需要注意:前面的代码当压入栈第一个数据时size是1,出栈时是要用size--访问的,所以先自减,再直接返回就是栈顶的值。

最后是Print函数:

cpp 复制代码
void StackPrint(struct Stacklist* stack) {
	for (stack->size; stack->size>0;) {
		printf("%c ", StackPop(stack));
	}
}

这就是文章的全部内容了,感谢阅读,如有错误欢迎指出。

相关推荐
刚学HTML13 分钟前
leetcode 05 回文字符串
算法·leetcode
Am心若依旧40918 分钟前
[c++11(二)]Lambda表达式和Function包装器及bind函数
开发语言·c++
明月看潮生20 分钟前
青少年编程与数学 02-004 Go语言Web编程 20课题、单元测试
开发语言·青少年编程·单元测试·编程与数学·goweb
大G哥30 分钟前
java提高正则处理效率
java·开发语言
AC使者33 分钟前
#B1630. 数字走向4
算法
冠位观测者37 分钟前
【Leetcode 每日一题】2545. 根据第 K 场考试的分数排序
数据结构·算法·leetcode
VBA633740 分钟前
VBA技术资料MF243:利用第三方软件复制PDF数据到EXCEL
开发语言
轩辰~42 分钟前
网络协议入门
linux·服务器·开发语言·网络·arm开发·c++·网络协议
小_太_阳1 小时前
Scala_【1】概述
开发语言·后端·scala·intellij-idea
向宇it1 小时前
【从零开始入门unity游戏开发之——unity篇02】unity6基础入门——软件下载安装、Unity Hub配置、安装unity编辑器、许可证管理
开发语言·unity·c#·编辑器·游戏引擎