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));
	}
}

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

相关推荐
IronMurphy24 分钟前
【算法四十三】279. 完全平方数
算法
墨染天姬30 分钟前
【AI】Hermes的GEPA算法
人工智能·算法
papership1 小时前
【入门级-数据结构-3、特殊树:完全二叉树的数组表示法】
数据结构·算法·链表
smj2302_796826521 小时前
解决leetcode第3911题.移除子数组元素后第k小偶数
数据结构·python·算法·leetcode
九转成圣2 小时前
Java 性能优化实战:如何将海量扁平数据高效转化为类目字典树?
java·开发语言·json
Beginner x_u2 小时前
链表专题:JS 实现原理与高频算法题总结
javascript·算法·链表
SmartRadio2 小时前
ESP32-S3 双模式切换实现:兼顾手机_路由器连接与WiFi长距离通信
开发语言·网络·智能手机·esp32·长距离wifi
laowangpython2 小时前
Rust 入门:GitHub 热门内存安全编程语言
开发语言·其他·rust·github
我叫汪枫2 小时前
在后台管理系统中,如何递归和选择保留的思路来过滤菜单
开发语言·javascript·node.js·ecmascript
_.Switch2 小时前
东方财富股票数据JS逆向:secids字段和AES加密实战
开发语言·前端·javascript·网络·爬虫·python·ecmascript