数据结构-栈的实现(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);
}
相关推荐
星马梦缘20 分钟前
算法与数据结构
数据结构·c++·算法·动态规划·克鲁斯卡尔·kahn
2501_9434691543 分钟前
【无标题】
数据结构·算法
Snow_day.1 小时前
有关排列排列组合(1)
数据结构·算法·贪心算法·动态规划·图论
im_AMBER1 小时前
Leetcode 100 在链表中插入最大公约数
数据结构·c++·笔记·学习·算法·leetcode·链表
独自破碎E1 小时前
【二分法】旋转数组的最小数字
数据结构·算法·排序算法
苦藤新鸡2 小时前
9.找到字符串中所有字母异位词
数据结构·c++·算法·力扣
ltqshs2 小时前
嵌入式C语言-指针数组和数组指针
c语言·数据结构·算法
独自破碎E2 小时前
【归并】数组中的逆序对
java·数据结构·算法
散峰而望3 小时前
【算法竞赛】链表和 list
数据结构·c++·算法·链表·list·哈希算法·推荐算法
w-w0w-w3 小时前
C++中vector的操作和简单实现
开发语言·数据结构·c++