纯c语言模拟栈(初学必看)

1.栈的概念及其结构

栈是一种特殊的线性表,在栈这个结构里,越先存进去的数据越难取出来。

这个结构就像是一个只有一端有打开的容器,越先放进去的球越在底部,想要把底部的球拿出来,就必须先把前面的求拿出来。像这种"先进后出"的结构就是栈

对于栈来说,我们只能在表尾进行插入或者删除,表

2.栈的功能

栈的基本操作主要有:栈的初始化、判空、判满、取栈顶元素、在栈顶进行插入和删除。在栈顶插入元素称为入栈,在栈顶删除元素称为出栈。

由于栈的特性,我们只对栈顶进行取出元素或者是压入元素,所以我们在实现栈的时候需要用一个top指针来指向栈顶元素的地址或者是栈顶元素后面的地址。

3.c语言代码模拟

Stack.h文件:

这个文件用来声明功能函数以及栈结构体数据的定义。

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int STDataType;
typedef struct Stack
{
	STDataType* _a;
	int _top;		// 栈顶
	int _capacity;  // 容量 
}Stack;
// 初始化栈 
void StackInit(Stack* ps);
// 入栈 
void StackPush(Stack* ps, STDataType data);
//打印
void StackPrint(Stack* ps);
// 出栈 
void StackPop(Stack* ps);
// 获取栈顶元素 
STDataType StackTop(Stack* ps);
// 获取栈中有效元素个数 
int StackSize(Stack* ps);
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps);
// 销毁栈 
void StackDestroy(Stack* ps);

Stack.c文件:

实现各种功能函数

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include"Stack.h"

// 初始化栈 
void StackInit(Stack* ps) {
	assert(ps);
	ps->_a = NULL;
	ps->_capacity = 0;
	ps->_top = 0;
}

// 销毁栈 
void StackDestroy(Stack* ps) {
	assert(ps);
	free(ps->_a);
	ps->_a = NULL;
	ps->_capacity = 0;
	ps->_top = 0;
}
// 入栈 
void StackPush(Stack* ps, STDataType data) {
	assert(ps);
	if (ps->_top == ps->_capacity) {
		STDataType* temp = NULL;
		int newcap = 0;
		if (ps->_capacity == 0) {
			newcap = 4;
		}
		else {
			newcap = ps->_capacity * 2;
		}
		temp = (STDataType*)realloc(ps->_a,sizeof(STDataType) * newcap);
		if (temp == NULL) {
			perror("mallc:fail");
		}
		ps->_a = temp;
		ps->_capacity = newcap;
	}

	ps->_a[ps->_top] = data;
	ps->_top++;
}

// 出栈 
void StackPop(Stack* ps) {
	assert(ps&&ps->_top>0);
	--ps->_top;
	//return ps->_a[--ps->_top];
}

//打印
void StackPrint(Stack* ps) {
	assert(ps);
	printf("top=%d  cap=%d\n", ps->_top, ps->_capacity);
	for (int i = 0; i < ps->_top; i++) {
		printf("%d->", ps->_a[i]);
	}
	printf("\n");
}
// 获取栈顶元素 
STDataType StackTop(Stack* ps) {
	assert(ps&&ps->_top>0);
	return ps->_a[ps->_top - 1];
}
// 获取栈中有效元素个数 
int StackSize(Stack* ps) {
	assert(ps);
	return ps->_top;
}
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps) {
	assert(ps);
	return ps->_top == 0;
}

test.c文件:

测试栈的功能是否达到预期

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include"Stack.h"

void test1() {
	Stack st;
	StackInit(&st);
	StackPush(&st, 1);
	StackPush(&st, 2);
	StackPush(&st, 3);
	StackPush(&st, 4);
	StackPrint(&st);
	printf("弹出栈顶元素\n");
	StackPop(&st);
	StackPrint(&st);
	int x =StackTop(&st);
	printf("获取栈顶元素 %d\n",x);
	StackPrint(&st);
	printf("获取栈里有效元素个数 %d\n", StackSize(&st));
	printf("栈是否为空%d\n", StackEmpty(&st));
	StackDestroy(&st);
}
int main() {
	test1();
	return 0;
}
相关推荐
apihz几秒前
通用图片搜索-搜狗源免费API接口使用指南
android·java·python·php·音视频
博睿谷IT99_几秒前
华为数据通信网络基础
开发语言·华为·php·华为认证
蓝桉(努力版)10 分钟前
MATLAB可视化5:华夫图(饼图的平替可以表示种类的分布,附有完整代码详细讲解)(求个关注、点赞和收藏)(对配色不满意可以自己调节配色,附调色教程)
开发语言·数学建模·matlab·信息可视化·matlab可视化
风象南16 分钟前
基于 SpringBoot 的 REST API 与 RPC 调用的统一封装
java·spring boot·后端
素雪风华22 分钟前
Jenkins+Gitee+Docker容器化部署
java·docker·gitee·jenkins·springboot·持续部署
艾莉丝努力练剑26 分钟前
【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(五)
c语言·开发语言·数据结构·学习·算法
云空28 分钟前
《QtPy:Python与Qt的完美桥梁》
开发语言·python·qt·pyqt
xienda42 分钟前
冒泡、选择、插入排序:三大基础排序算法深度解析(C语言实现)
数据结构·算法·排序算法
晓131343 分钟前
JavaScript加强篇——第六章 定时器(延时函数)与JS执行机制
开发语言·javascript·ecmascript
future141243 分钟前
游戏开发日记7.12
数据结构·学习·c#·游戏开发