目录
栈_Stack
【1】栈的概念及结构
【2】栈的实现
【1.1】栈数据结构的接口
【1.2】栈的初始化
【1.3】栈的释放
【1.4】入栈
【1.5】出栈
【1.6】获取栈顶数据
【1.8】获取栈中的有效元素个数
【1.9】检测栈是否为空
栈_Stack
【1】栈的概念及结构
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。
栈:后进先出(Last In Firsh Out)
【2】栈的实现
栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。
如果有特定场合要用链表作为栈的实现,那我们应该将头和尾巴翻过来,示意图:
【1.1】栈数据结构的接口
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
// 栈数据结构定义 ///
/* 栈数据结构 */
typedef int STDataType;
typedef struct Stack {
STDataType* _buffer;
size_t _top;
size_t _capacity;
}ST;
// 栈常用接口定义 ///
/* 栈:初始化 */
void StackInit(ST* pSt);
/* 栈:销毁 */
void StackDestory(ST* pSt);
/* 栈:入栈 */
void StackPush(ST* pSt, STDataType val);
/* 栈:出栈 */
void StackPop(ST* pSt);
/* 栈:获取栈顶数据 */
STDataType StackTop(ST* pSt);
/* 栈:获取栈中有效元素个数 */
size_t StackSize(ST* pSt);
/* 栈:检查是否为空栈 */
bool StackEmpty(ST* pSt);
【1.2】栈的初始化
/* 栈:初始化 */
void StackInit(ST* pSt) {
// 断言
assert(pSt);
// 初始化
pSt->_buffer = NULL;
pSt->_top = pSt->_capacity = 0;
}
【1.3】栈的释放
/* 栈:销毁 */
void StackDestory(ST* pSt) {
// 断言
assert(pSt);
// 销毁内存,初始化变量
free(pSt->_buffer); pSt->_buffer = NULL;
pSt->_top = pSt->_capacity = 0;
pSt = NULL;
}
【1.4】入栈
入栈动图演示
入栈的两种情况
/* 栈:入栈 */
void StackPush(ST* pSt, STDataType val) {
// 断言
assert(pSt);
// 检查容量
if (pSt->_top == pSt->_capacity) {
size_t newCapacity = pSt->_capacity == 0 ? 4 : pSt->_capacity * 2;
STDataType* pTemp = (STDataType*)realloc(pSt->_buffer, sizeof(STDataType) * newCapacity);
// 开辟失败
if (pTemp == NULL) {
perror("realloc fail!");
exit(-1);
}
// 开辟成功
pSt->_buffer = pTemp; pTemp = NULL;
pSt->_capacity = newCapacity;
}
// 数据入栈
pSt->_buffer[pSt->_top] = val;
pSt->_top++;
}
【1.5】出栈
出栈动图演示
/* 栈:出栈 */
void StackPop(ST* pSt) {
// 断言
assert(pSt);
assert(!StackEmpty(pSt));
pSt->_top--;
}
【1.6】获取栈顶数据
/* 栈:获取栈顶数据 */
STDataType StackTop(ST* pSt) {
// 断言
assert(pSt);
assert(!StackEmpty(pSt));
return pSt->_buffer[pSt->_top - 1];
}
【1.8】获取栈中的有效元素个数
/* 栈:获取栈中有效元素个数 */
size_t StackSize(ST* pSt) {
// 断言
assert(pSt);
return pSt->_top;
}
【1.9】检测栈是否为空
/* 栈:检查是否为空栈 */
bool StackEmpty(ST* pSt) {
// 断言
assert(pSt);
return pSt->_top == 0;
}