C语言中栈数据结构的基本实现

概述

栈的特点

使用只能在一端进行插入和删除操作的特殊线性表。

按照后进先出的原则存储数据:

  • 先进入的数据被压入栈底,最后的数据在栈顶
  • 需要读取数据的时候,从栈顶开始读取数据

基本实现

栈的创建和初始化

stack.h

#ifndef C01_HELLO_CLION_STACK_H
#define C01_HELLO_CLION_STACK_H// 公共头文件
#include "stdio.h"
#include "string.h"
#include "stdlib.h"// 栈
typedef struct stack {int *arr;int cap;int top;
} Stack;// 栈方法
extern void newStack(Stack *stack, int cap); // 初始化
extern void freeStack(Stack *stack); // 释放栈#endif //C01_HELLO_CLION_STACK_H

stack.c

#include "stack.h"// 创建栈
void newStack(Stack *stack, int cap) {// 给栈分配内存stack->arr = malloc(sizeof(int) * cap);// 初始化容量stack->cap = cap;// 初始化topstack->top = 0;
}// 释放栈
void freeStack(Stack *stack) {free(stack->arr);stack->cap = 0;stack->top = 0;
}

判断栈是否满了

核心代码:

int isFullStack(Stack *stack) {return stack->top >= stack->cap;
}

stack.h

#ifndef C01_HELLO_CLION_STACK_H
#define C01_HELLO_CLION_STACK_H// 公共头文件
#include "stdio.h"
#include "string.h"
#include "stdlib.h"// 栈
typedef struct stack {int *arr;int cap;int top;
} Stack;// 栈方法
extern void newStack(Stack *stack, int cap); // 初始化
extern void freeStack(Stack *stack); // 释放栈
extern int isFullStack(Stack *stack); // 判断栈是否满了#endif //C01_HELLO_CLION_STACK_H

stack.c

#include "stack.h"// 创建栈
void newStack(Stack *stack, int cap) {// 给栈分配内存stack->arr = malloc(sizeof(int) * cap);// 初始化容量stack->cap = cap;// 初始化topstack->top = 0;
}// 释放栈
void freeStack(Stack *stack) {free(stack->arr);stack->cap = 0;stack->top = 0;
}// 判断栈是否满了
int isFullStack(Stack *stack) {return stack->top >= stack->cap;
}

判断栈是否为空

核心代码:

int isEmptyStack(Stack *stack) {return stack->top == 0;
}

stack.h

#ifndef C01_HELLO_CLION_STACK_H
#define C01_HELLO_CLION_STACK_H// 公共头文件
#include "stdio.h"
#include "string.h"
#include "stdlib.h"// 栈
typedef struct stack {int *arr;int cap;int top;
} Stack;// 栈方法
extern void newStack(Stack *stack, int cap); // 初始化
extern void freeStack(Stack *stack); // 释放栈
extern int isFullStack(Stack *stack); // 判断栈是否满了
extern int isEmptyStack(Stack *stack); // 判断栈是否为空#endif //C01_HELLO_CLION_STACK_H

stack.c

#include "stack.h"// 创建栈
void newStack(Stack *stack, int cap) {// 给栈分配内存stack->arr = malloc(sizeof(int) * cap);// 初始化容量stack->cap = cap;// 初始化topstack->top = 0;
}// 释放栈
void freeStack(Stack *stack) {free(stack->arr);stack->cap = 0;stack->top = 0;
}// 判断栈是否满了
int isFullStack(Stack *stack) {return stack->top >= stack->cap;
}// 判断栈是否为空
int isEmptyStack(Stack *stack) {return stack->top == 0;
}

入栈

核心代码:

void pushStack(Stack *stack, int value) {if (stack == NULL) {return;}if (isFullStack(stack)) {printf("the stack is full\n");return;}stack->arr[stack->top] = value;stack->top++;
}

stack.h

#ifndef C01_HELLO_CLION_STACK_H
#define C01_HELLO_CLION_STACK_H// 公共头文件
#include "stdio.h"
#include "string.h"
#include "stdlib.h"// 栈
typedef struct stack {int *arr;int cap;int top;
} Stack;// 栈方法
extern void newStack(Stack *stack, int cap); // 初始化
extern void freeStack(Stack *stack); // 释放栈
extern int isFullStack(Stack *stack); // 判断栈是否满了
extern int isEmptyStack(Stack *stack); // 判断栈是否为空
extern void pushStack(Stack *stack, int value); // 入栈#endif //C01_HELLO_CLION_STACK_H

stack.c

#include "stack.h"// 创建栈
void newStack(Stack *stack, int cap) {// 给栈分配内存stack->arr = malloc(sizeof(int) * cap);// 初始化容量stack->cap = cap;// 初始化topstack->top = 0;
}// 释放栈
void freeStack(Stack *stack) {free(stack->arr);stack->cap = 0;stack->top = 0;
}// 判断栈是否满了
int isFullStack(Stack *stack) {return stack->top >= stack->cap;
}// 判断栈是否为空
int isEmptyStack(Stack *stack) {return stack->top == 0;
}// 入栈
void pushStack(Stack *stack, int value) {if (stack == NULL) {return;}if (isFullStack(stack)) {printf("the stack is full\n");return;}stack->arr[stack->top] = value;stack->top++;
}

出栈

核心代码:

int popStack(Stack *stack) {if (stack == NULL) {printf("the stack is null\n");return -1;}if (isEmptyStack(stack)) {printf("the stack is empty\n");return -1;}int value = stack->arr[stack->top];stack->top--;return value;
}

stack.h

#ifndef C01_HELLO_CLION_STACK_H
#define C01_HELLO_CLION_STACK_H// 公共头文件
#include "stdio.h"
#include "string.h"
#include "stdlib.h"// 栈
typedef struct stack {int *arr;int cap;int top;
} Stack;// 栈方法
extern void newStack(Stack *stack, int cap); // 初始化
extern void freeStack(Stack *stack); // 释放栈
extern int isFullStack(Stack *stack); // 判断栈是否满了
extern int isEmptyStack(Stack *stack); // 判断栈是否为空
extern void pushStack(Stack *stack, int value); // 入栈
extern int popStack(Stack *stack); // 出栈#endif //C01_HELLO_CLION_STACK_H

stack.c

#include "stack.h"// 创建栈
void newStack(Stack *stack, int cap) {// 给栈分配内存stack->arr = malloc(sizeof(int) * cap);// 初始化容量stack->cap = cap;// 初始化topstack->top = 0;
}// 释放栈
void freeStack(Stack *stack) {free(stack->arr);stack->cap = 0;stack->top = 0;
}// 判断栈是否满了
int isFullStack(Stack *stack) {return stack->top >= stack->cap;
}// 判断栈是否为空
int isEmptyStack(Stack *stack) {return stack->top == 0;
}// 入栈
void pushStack(Stack *stack, int value) {if (stack == NULL) {return;}if (isFullStack(stack)) {printf("the stack is full\n");return;}stack->arr[stack->top] = value;stack->top++;
}// 出栈
int popStack(Stack *stack) {if (stack == NULL) {printf("the stack is null\n");return -1;}if (isEmptyStack(stack)) {printf("the stack is empty\n");return -1;}int value = stack->arr[stack->top];stack->top--;return value;
}

创建栈方法优化

核心代码:

// 创建栈
Stack *newStack(int cap) {// 创建栈Stack *stack = malloc(sizeof(Stack));// 给栈数组分配内存stack->arr = malloc(sizeof(int) * cap);// 初始化容量stack->cap = cap;// 初始化topstack->top = 0;// 返回return stack;
}// 释放栈
void freeStack(Stack *stack) {free(stack->arr);free(stack);
}

stack.h

#ifndef C01_HELLO_CLION_STACK_H
#define C01_HELLO_CLION_STACK_H// 公共头文件
#include "stdio.h"
#include "string.h"
#include "stdlib.h"// 栈
typedef struct stack {int *arr;int cap;int top;
} Stack;// 栈方法
extern Stack * newStack(int cap); // 初始化
extern void freeStack(Stack *stack); // 释放栈
extern int isFullStack(Stack *stack); // 判断栈是否满了
extern int isEmptyStack(Stack *stack); // 判断栈是否为空
extern void pushStack(Stack *stack, int value); // 入栈
extern int popStack(Stack *stack); // 出栈#endif //C01_HELLO_CLION_STACK_H

stack.c

#include "stack.h"// 创建栈
Stack *newStack(int cap) {// 创建栈Stack *stack = malloc(sizeof(Stack));// 给栈数组分配内存stack->arr = malloc(sizeof(int) * cap);// 初始化容量stack->cap = cap;// 初始化topstack->top = 0;// 返回return stack;
}// 释放栈
void freeStack(Stack *stack) {free(stack->arr);free(stack);
}// 判断栈是否满了
int isFullStack(Stack *stack) {return stack->top >= stack->cap;
}// 判断栈是否为空
int isEmptyStack(Stack *stack) {return stack->top == 0;
}// 入栈
void pushStack(Stack *stack, int value) {if (stack == NULL) {return;}if (isFullStack(stack)) {printf("the stack is full\n");return;}stack->arr[stack->top] = value;stack->top++;
}// 出栈
int popStack(Stack *stack) {if (stack == NULL) {printf("the stack is null\n");return -1;}if (isEmptyStack(stack)) {printf("the stack is empty\n");return -1;}int value = stack->arr[stack->top];stack->top--;return value;
}

使用栈

main.c

#include <stdio.h>
#include "stack.h"int main() {// 创建栈Stack *stack = newStack(3);// 入栈pushStack(stack, 11);pushStack(stack, 22);pushStack(stack, 33);pushStack(stack, 333); // 栈满了// 出栈printf("%d\n", popStack(stack));printf("%d\n", popStack(stack));printf("%d\n", popStack(stack));printf("%d\n", popStack(stack)); // 栈空了// 释放内存freeStack(stack);return 0;
}

输出:

the stack is full
305
33
22
the stack is empty
-1

遍历栈

main.c

#include <stdio.h>
#include "stack.h"int main() {// 创建栈Stack *stack = newStack(3);// 入栈pushStack(stack, 11);pushStack(stack, 22);pushStack(stack, 33);// 遍历栈while (!isEmptyStack(stack)) {printf("%d\n", popStack(stack));}// 释放内存freeStack(stack);return 0;
}

输出:

588
33
22

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/9323.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python:鸭子类型使用场景

python&#xff1a;鸭子类型使用场景 1 前言 “一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子&#xff0c;那么这只鸟可以被称为鸭子。“----鸭子模型 鸭子模型是Python中的一种编程哲学&#xff0c;也被称为“鸭子类型”。它来源于一句话&#xff1a;“如果它走起路…

qt 5.15.x 安装android过程记录

1.经过好几天的qt for android 安装&#xff0c;发现存在很多坑 参考其他文章可以编译出APK文件。但是我发现(我的机器上)无法调试apk程序&#xff0c;不能调试那怎么行呢&#xff0c;看了很多文章都是运行出结果了就结束了。没有展示怎么调试程序。 很多文章都是建议安装JDK8…

CTF数据安全大赛crypto题目解题过程

CTF-Crypto加密题目内容 下面是一个Base64加密的密文 bXNobnszODdoajM3MzM1NzExMzQxMmo4MGg0bDVoMDYzNDQzNH0原文链接&#xff1a; 数据安全大赛CTF-Crypto题目 - 红客网-网络安全与渗透技术 我们用Python写一个解密脚本&#xff1a; import base64 import time #base64加密…

韩顺平0基础学Java——第7天

p110-p154 控制结构&#xff08;第四章&#xff09; 多分支 if-elseif-else import java.util.Scanner; public class day7{public static void main(String[] args) {Scanner myscanner new Scanner(System.in);System.out.println("input your score?");int s…

什么是Jetpack

Jetpack Jetpack 是一套组件库、工具&#xff0c;可帮助开发人员遵循最佳做法&#xff0c;减少样板代码并编写可在 Android 版本和设备上一致工作的代码&#xff0c;以便开发人员可以专注于他们关心的代码 组成 主要包含四部分&#xff1a;架构&#xff08;Architecture&…

Linux:进程通信(三)信号的捕捉

目录 一、信号捕捉函数 1、signal函数 2、sigaction函数 二、用户态与内核态 1、用户态 2、内核态 用户态与内核态转换 三、volatile关键字 四、SIGCHLD信号 一、信号捕捉函数 1、signal函数 signal函数是C语言标准库中的一个函数&#xff0c;用于处理Unix/Linux系…

Ps 滤镜:其它

Ps菜单&#xff1a;滤镜/其它 Filter/others “其它”子菜单中的滤镜允许创建自己的滤镜、使用滤镜修改蒙版、在图像中使选区发生位移和快速调整颜色。 HSB/HSL HSB/HSL 主要用于实现 RGB、HSB 及 HSL 三种模型的相互转换。 比如&#xff0c;当执行本滤镜从 RGB 转换为 HSB 之后…

国内不同领域对应的AI简谈

AI的普及极大方便了我们的学习和生活&#xff0c;当然&#xff0c;我们很多时候仍找不到适合自己需求的AI工具&#xff0c;那我们便盘点一下国内直接访问的各个领域的AI工具&#xff1a; AI写作辅助 秘塔写作猫说明&#xff1a;秘塔写作猫是一款AI写作工具&#xff0c…

YOLOv8网络结构介绍

将按照YOLOv8目标检测任务、实例分割任务、关键点检测任务以及旋转目标检测任务的顺序来介绍&#xff0c;主要内容也是在目标检测任务中介绍&#xff0c;其他任务也只是Head层不相同。 1.YOLOv8_det网络结构 首先&#xff0c;YOLOv8网络分成了三部分&#xff0c;分别是主干网络…

接口信息解析

在进行浏览器网站的接口测试时&#xff0c;需要解析以下关键信息以确保接口的正确性和性能&#xff1a; 1. 接口地址&#xff08;URL&#xff09;&#xff1a; 接口的地址是测试的基础&#xff0c;包括接口的协议&#xff08;如 HTTP 或 HTTPS&#xff09;、主机名、端口&…

leetcode 2105. 给植物浇水 II

2105. 给植物浇水 II 题目描述 Alice 和 Bob 打算给花园里的 n 株植物浇水。植物排成一行&#xff0c;从左到右进行标记&#xff0c;编号从 0 到 n - 1 。每一株植物都需要浇特定量的水。Alice 和 Bob 每人有一个水罐&#xff0c;最初是满的。他们按照以下描述的方式完成浇水…

自动控制原理学习--平衡小车的控制算法(三)

上一节PID的simulin仿真&#xff0c;这一节用LQR 一、模型 二、LQR LQR属于现代控制理论的一个很重要的点&#xff0c;这里推荐B站的【Advanced控制理论】课程&#xff08;up主DR_CAN&#xff09;&#xff0c;讲得很好&#xff0c;这里引用了他视频里讲LQR的ppt。 LQR属于lo…

(三)小程序样式和组件

视频链接&#xff1a;尚硅谷2024最新版微信小程序 文章目录 小程序的样式和组件介绍样式-尺寸单位 rpx样式-全局样式和局部样式组件-组件案例演示组件案例-轮播图区域绘制组件案例-轮播图图片添加组件案例-绘制公司信息区域组件案例-商品导航区域组件案例-跳转到商品列表组件案…

python爬取sci论文等一系列网站---通用教程超详细教程

环境准备 确保安装了Python以及requests和BeautifulSoup库。 pip install requests beautifulsoup4确定爬取目标 选择一个含有SCI论文的网站&#xff0c;了解该网站的内容布局和数据结构。 &#xff08;1&#xff09;在浏览器中访问目标网站&#xff0c;右键点击页面并选择…

案例研究|硬之城借助DataEase以数据驱动供应链精细化管理

深圳硬之城信息技术有限公司&#xff08;以下简称为“硬之城”&#xff09;成立于2015年&#xff0c;专注电子元件供应链领域&#xff0c;定位于电子产业供应链与智造平台。硬之城通过名为“Allchips”的集成式服务平台&#xff0c;为客户提供一站式的电子元件采购和供应链管理…

VTK 建模方法:建模基础

VTK 建模方法&#xff1a;建模基础 VTK 建模方法&#xff1a;建模基础VTK 中模型的表达实例1&#xff1a;自定义 vtkPolyData实例2&#xff1a;vtkTubeFilter实例3&#xff1a;vtkImplicitModeller实例4&#xff1a;vtkRegularPolygonSource实例5&#xff1a;vtkWarpTo VTK 建模…

如何在mac电脑安装 Android SDK

1、在 Mac 电脑上安装 Android SDK 的步骤如下: 前往 Android 开发者网站下载 Android SDK 打开 Android 开发者网站 (https://developer.android.com/studio) 打开下载好的 Android SDK 安装包 2、解压 Android SDK 安装包 打开下载好的 Android SDK 安装包 将 android-…

[力扣题解]78.子集

题目&#xff1a;子集 思路 回溯法 代码 class Solution { public:vector<vector<int>> result;vector<int> path;void function(vector<int>& nums, int startindex){// 为什么要到这里写? 后面调用递归之前就不对result.push_back(path);//…

深度主动学习(Deep Active Learning)——基于pytorch和ALipy工具包实现双向GRU模型

前言 在ALipy的官网说ALipy只支持sklearn和tensorflow模型&#xff0c;模型对象应符合 scikit-learn api。 但是alipy提供了ToolBox的工具箱&#xff0c;里面包装了多种查询策略&#xff0c;计算指标等工具&#xff0c;几乎具有Alipy的全部功能&#xff0c;虽然不能使用ALipy提…

华为昇腾310B1平台深度学习算法模型转换

目录 1 模型转换(集成nms算子到模型中) 1.1 基础模型说明 1.2 模型转换 1.2.1 设置环境变量 1.2.2 安装yolov5依赖&#xff08;gcc需要>7.5&#xff09; 1.2.3 转换fp16模型 2 模型转换(使用atc&#xff0c;不集成nms算子) 参考文献&#xff1a; 1 模型转换(集成nms…