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

前言

栈是一种特殊的线性表,只允许在固定的一端进行插入和删除的操作,**进行数据插入和删除的一端叫做栈顶,另一端叫做栈底。**栈中的数据元素遵循后进先出的的原则。

目录

1.压栈和出栈

[2. 栈的实现](#2. 栈的实现)

3.测试代码


1.压栈和出栈

压栈:栈的插入操作叫 压栈,入数据在栈顶。

弹栈:栈的删除操作叫做出栈。出数据也在栈顶。

如图:

2. 栈的实现

//stack.h

cpp 复制代码
#include<stdlib.h>
#include<assert.h>
#include<stdio.h>
#include<stdbool.h>
typedef int SDataType;
typedef struct Stack
{
	SDataType* _a;
	int _top;//栈顶数据
	int _capacity;//容量
}Stack;
void StackInit(Stack* st);//初始化栈
void StackDestory(Stack* st);//销毁栈
void StackPush(Stack* st, SDataType data);//入栈
void StackPop(Stack* st);//出栈

size_t StackSize(Stack* st);//获取栈中元素的数目

SDataType StackTop(Stack* st);//获取栈顶元素

bool StackEmpty(Stack* st);//判断栈是否为空

//stack.c

cpp 复制代码
void StackInit(Stack* st)//初始化栈
{
	st->_a = (SDataType*)malloc(sizeof(SDataType) * 4);
	//申请空间
	//初始化数据
	st->_capacity = 4;
	st->_top = 0;
}
void StackDestory(Stack* st)//销毁栈
{
	free(st->_a);//释放空间
	st->_capacity = st->_top = 0;
}
void StackPush(Stack* st, SDataType data)//入栈
{
	assert(st);//判断指针是否存在

	if (st->_capacity == st->_top)
	{
		//空间满了需要增容
		st->_capacity *= 2;
		SDataType* p = (SDataType *)realloc(st->_a, st->_capacity * sizeof(SDataType));
		if (p == NULL)
		{
			printf("内存不足\n");
			exit(-1);
		}
		st->_a = p;
	}
	st->_a[st->_top] = data;
	++(st->_top);
}
void StackPop(Stack* st)//出栈
{
	assert(st);//确保指针存在
	assert(st->_top > 0);
	--(st->_top);
}
size_t StackSize(Stack* st)//获取栈中元素的数目
{
	assert(st);//确保指针存在
	size_t size = 0;
	return size = st->_top;
}
SDataType StackTop(Stack* st)//获取栈顶元素
{
	return st->_a[(st->_top) -1 ];
}
bool StackEmpty(Stack* st)//判断栈是否为空
{
	return !st->_top;
}

3.测试代码

cpp 复制代码
void TestStack()
{
	Stack st;
	StackInit(&st);
	StackPush(&st, 1);
	StackPush(&st, 2);
	StackPush(&st, 3);
	StackPush(&st, 4);
	StackPush(&st, 5);
	StackPush(&st, 6);
	StackPush(&st, 7);
	StackPush(&st, 8);
	while (!StackEmpty(&st))
	{
		printf("%d ", StackTop(&st));
		StackPop(&st);
	}
	StackDestory(&st);
}
相关推荐
Shinom1ya_18 分钟前
算法 day 41
数据结构·算法·leetcode
无敌最俊朗@43 分钟前
C++ 值类别与移动语义详解(精简版)
java·数据结构·算法
岑梓铭2 小时前
《考研408数据结构》第六章(5.5树的应用)复习笔记
数据结构·笔记·考研·408·ds
不觉晚秋2 小时前
极限挑战之一命速通哈夫曼树
c语言·数据结构··哈夫曼树
第七序章2 小时前
【C + +】C++11 (下) | 类新功能 + STL 变化 + 包装器全解析
c语言·数据结构·c++·人工智能·哈希算法·1024程序员节
仰泳的熊猫3 小时前
LeetCode:72. 超级次方
数据结构·c++·算法·leetcode
yuuki2332333 小时前
【数据结构】单链表的实现
c语言·数据结构·后端
吴名氏.4 小时前
细数Java中List的10个坑
java·开发语言·数据结构·list
_dindong4 小时前
牛客101:递归/回溯
数据结构·c++·笔记·学习·算法·leetcode·深度优先
刃神太酷啦5 小时前
力扣校招算法通关:双指针技巧全场景拆解 —— 从数组操作到环检测的高效解题范式
java·c语言·数据结构·c++·算法·leetcode·职场和发展