当前位置: 首页 > news >正文

【数据结构:栈】——栈的实现(C语言)

1、什么是栈?

栈: 一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶
出栈:栈的删除操作叫做出栈。出数据也在栈顶。
详细了解:栈的详解
进栈、出栈操作

2、栈的实现

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。
数组结构:
数组实现栈的原理
链表结构:
链表实现栈的原理

3、代码实现

Stack.h文件

typedef int STDataType;

typedef struct Stack
{
	STDataType* _array;
	size_t _top;
	size_t _capacity;
}Stack;

void StackInit(Stack* ps);//初始化
void StackDestory(Stack* ps);//销毁
void StackPush(Stack* ps, STDataType x);//尾插
void StackPop(Stack* ps);//尾删
STDataType StackTop(Stack* ps);//取到当前栈顶元素
int StackEmpty(Stack* ps);//判断栈是否为空
int StackSize(Stack* ps);//判断栈中的元素个数
void StackPrint(Stack* ps);//从栈中取出元素
void PintfStack(Stack* ps);//查看栈中元素
void Test();//测试

Stack.c文件

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

void StackDestory(Stack* ps)//销毁
{
	assert(ps && ps->_array != NULL);

	free(ps->_array);
	ps->_array = NULL;
	ps->_capacity = ps->_top = 0;
}

void StackPush(Stack* ps, STDataType x)//尾插
{
	assert(ps);
    
	if (ps->_top == ps->_capacity)//判断容量是否够用
	{
		size_t new_capacity = ps->_array == 0 ? 8 : (ps->_capacity) * 2;//三目运算符判断容量是否够用
		ps->_array = (STDataType*)realloc(ps->_array, new_capacity*sizeof(STDataType));
		assert(ps->_array);//判断是否申请到内存
		ps->_capacity = new_capacity;
	}
	//插入数据
	ps->_array[ps->_top] = x;
	ps->_top++;
}

void StackPop(Stack* ps)//尾删
{
	assert(ps && ps->_array != NULL);

	--ps->_top;//把栈顶指针向前移动一位,完成出栈
}

STDataType StackTop(Stack* ps)//取到当前栈顶元素
{
	assert(ps && ps->_array != NULL);

	return ps->_array[ps->_top - 1];
}

int StackEmpty(Stack* ps)//判断栈是否为空
{
	assert(ps);
	return ps->_top == 0 ? 0 : 1;
}

int StackSize(Stack* ps)//判断栈中的元素个数
{
	assert(ps);

	return ps->_top;
}

void StackPrint(Stack* ps)//从栈中取出元素
{
	assert(ps && ps->_array != NULL);
	
	while (StackEmpty(ps))
	{
		printf("%d->",StackTop(ps));//每次取出栈顶元素
		StackPop(ps);
	}
	printf("NULL");
	printf("\n");
}

void PintfStack(Stack* ps)//查看栈中元素
{
	assert(ps);
	
	if (ps->_top == 0)
	{
		printf("栈中为空!!!\n");
	}
	else
	{
		for (size_t n = 0; n < ps->_top; n++)
		{
			printf("%d->", ps->_array[n]);
		}
		printf("NULL\n");
	}

}


void Test()
{
	Stack pl;
	StackInit(&pl);//初始化
	
	//尾插
	StackPush(&pl, 0);
	StackPush(&pl, 1);
	StackPush(&pl, 2);
	StackPush(&pl, 3);
	StackPush(&pl, 4);
	StackPush(&pl, 5);
	//取出栈中元素
	
	//销毁栈
	StackDestory(&pl);
}

main.c文件

#include"Stack.h"

int main()
{
	Test();

	system("pause");
	return 0;
}

运行截图
运行截图

相关文章:

  • 【数据结构:链表】——无头单向非循环链表的实现(C语言)
  • 【数据结构:链表】——带头双向循环链表的实现(C语言)
  • 【数据结构:堆】——堆及堆的相关操作(C语言)
  • c++入门——基础知识点(1)
  • c/c++内存管理
  • 函数模板、类模板初识
  • 【Linux】进程地址空间了解
  • 【Linux】入门基础命令(1)
  • c++入门——基础知识点(2)
  • 【Linux】基础文件的I/O操作(1)
  • 【Linux】进程信号
  • 【Linux】网络编程套接字(1)
  • 【Linux】UDP网络套接字编程
  • 【数据结构:树】——搜索二叉树-K模型(非递归和递归)
  • 【C++】——STL关联式容器认识以及使用
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • 11111111
  • 2017 前端面试准备 - 收藏集 - 掘金
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • es的写入过程
  • Java多态
  • Java面向对象及其三大特征
  • Laravel核心解读--Facades
  • magento2项目上线注意事项
  • Python 基础起步 (十) 什么叫函数?
  • spring + angular 实现导出excel
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 排序(1):冒泡排序
  • 如何解决微信端直接跳WAP端
  • 入口文件开始,分析Vue源码实现
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 物联网链路协议
  • 新版博客前端前瞻
  • 移动端解决方案学习记录
  • 异步
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 如何正确理解,内页权重高于首页?
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • #pragam once 和 #ifndef 预编译头
  • $L^p$ 调和函数恒为零
  • (1)(1.13) SiK无线电高级配置(五)
  • (ZT)出版业改革:该死的死,该生的生
  • (翻译)terry crowley: 写给程序员
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (新)网络工程师考点串讲与真题详解
  • (一)Dubbo快速入门、介绍、使用
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转)四层和七层负载均衡的区别
  • (状压dp)uva 10817 Headmaster's Headache
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...