手搓数组栈(C语言)

embedded/2024/9/22 11:01:37/

stack.h

#pragma once#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{STDataType* a;int top;		// 栈顶int capacity;  // 容量 
}Stack;
// 初始化栈 
void StackInit(Stack* ps);
// 入栈 
void StackPush(Stack* ps, STDataType data);
// 出栈 
void StackPop(Stack* ps);
// 获取栈顶元素 
STDataType StackTop(Stack* ps);
// 获取栈中有效元素个数 
int StackSize(Stack* ps);
// 检测栈是否为空
bool StackEmpty(Stack* ps);
// 销毁栈 
void StackDestroy(Stack* ps);

stack.c

#include "stack.h"// 初始化栈 
void StackInit(Stack* ps)
{assert(ps);ps->a = NULL;ps->top = 0;ps->capacity = 0;
}// 入栈 
void StackPush(Stack* ps, STDataType data)
{assert(ps);if (ps->top == ps->capacity){int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;Stack* tmp = (Stack*)realloc(ps->a, sizeof(STDataType) * newCapacity);if (tmp == NULL){perror("StackPush");exit(-1);}ps->a = tmp;ps->capacity = newCapacity;}ps->a[ps->top++] = data;
}// 出栈 
void StackPop(Stack* ps)
{assert(ps);assert(ps->top > 0);ps->top--;
}// 获取栈顶元素 
STDataType StackTop(Stack* ps)
{assert(ps);return ps->a[ps->top - 1];
}// 获取栈中有效元素个数 
int StackSize(Stack* ps)
{assert(ps);return ps->top;
}// 检测栈是否为空
bool StackEmpty(Stack* ps)
{assert(ps);if (ps->top){return false;}return true;
}// 销毁栈 
void StackDestroy(Stack* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->top = 0;ps->capacity = 0;
}

stackTest.c

#include "stack.h"int main()
{Stack s;//初始化StackInit(&s);//入栈StackPush(&s, 1);StackPush(&s, 2);StackPush(&s, 3);StackPush(&s, 4);StackPush(&s, 5);//打印大小int size = StackSize(&s);printf("%d\n", size);//打印栈顶元素while (!StackEmpty(&s) ){int tmp = StackTop(&s);//出栈StackPop(&s);printf("%d ", tmp);}//销毁StackDestroy(&s);return 0;
}

测试示例


http://www.ppmy.cn/embedded/24893.html

相关文章

Protobuf 通信协议

Protobuf Protobuf 简介使用技术内幕 Protobuf 简介 在移动互联网时代&#xff0c;手机流量、电量是最为有限的资源&#xff0c;而移动端的即时通讯应用无疑必须得直面这两点 解决流量过大的基本方法就是使用高度压缩的通信协议&#xff0c;而数据压缩后流量减小带来的自然结…

Vue3框架

Vue3框架 一.使用create-vue搭建Vue3项目二.组合式API - setup选项1.setup选项的写法和执行时机2.setup中写代码的特点3. script setup 语法糖 三.组合式API - reactive和ref函数1. reactive2. ref3. reactive 对比 ref 四.组合式API - computed五.组合式API - watch1. 侦听单个…

深圳工厂车间降温通风设备

深圳工厂降温方案多种多样&#xff0c;可以根据工厂的具体情况和需求来选择合适的方案。以下是一些常见的降温方案&#xff1a; 通风换气&#xff1a;通过安装负压风机或冷风机等设备&#xff0c;加强通风换气&#xff0c;将室内热空气排出&#xff0c;吸入室外相对凉爽的空气…

图纸文件如何实现全加密,在透明加密的基础上实现全加密功能

最近不断在网络上有人提出来为什么我公司已经用了图纸加密软件&#xff0c;还是会出来图纸泄露的情况&#xff0c;他们是如何泄露出去的呢&#xff1f;我们知道市场上现在有很多图纸加密软件&#xff0c;都是采用驱动层透明加密技术&#xff0c;每家公司在介绍方案时&#xff0…

动态规划入门和应用示例

文章目录 前言斐波那契数列爬楼梯总结优点&#xff1a;缺点&#xff1a; 前言 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是运筹学的一个分支&#xff0c;是求解决策过程最优化的数学方法。它主要用于解决一类具有重叠子问题和最优子结构性质的问题。…

Java自定义工具类中使用RedisTemplate的遇到空指针问题

话不多说&#xff0c;上错误代码&#xff0c;以下是我在静态方法里使用RedisTemplate类&#xff0c;这里加了Autowired ****省略import包**** Component public class CommonUtils {Autowiredprivate static RedisTemplate redisTemplate;public static String test() {String…

Java基础知识总结(80)

CLH释放锁的过程 线程A执行完临界区代码后开始unlock&#xff08;释放&#xff09;操作&#xff0c;设置nodeA的前驱引用为null(方便垃圾回收器回收)&#xff0c;锁状态locked为false。 线程B执行抢到锁并且完成临界区代码的执行后&#xff0c;开始unlock&#xff08;释放&am…

网络安全(黑客)—-2024自学手册

一、什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试”等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面性…