数据结构-栈的实现(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);
}
相关推荐
Yingye Zhu(HPXXZYY)10 分钟前
Codeforces 2021 C Those Who Are With Us
数据结构·c++·算法
liulilittle1 小时前
LinkedList 链表数据结构实现 (OPENPPP2)
开发语言·数据结构·c++·链表
秋说2 小时前
【PTA数据结构 | C语言版】两枚硬币
c语言·数据结构·算法
☆璇3 小时前
【数据结构】栈和队列
c语言·数据结构
chao_7896 小时前
回溯题解——子集【LeetCode】二进制枚举法
开发语言·数据结构·python·算法·leetcode
秋说6 小时前
【PTA数据结构 | C语言版】将数组中元素反转存放
c语言·数据结构·算法
qqxhb8 小时前
零基础数据结构与算法——第四章:基础算法-排序(中)
数据结构·算法·排序算法·归并·快排·堆排
木叶丸9 小时前
编程开发中,那些你必须掌握的基本概念
前端·数据结构·编程语言
手握风云-10 小时前
优选算法的链脉之韵:链表专题
数据结构·算法·链表
老虎062712 小时前
数据结构(Java)--位运算
java·开发语言·数据结构