C语言数据结构与算法--简单实现栈的出栈与入栈
(一)栈的基本概念
栈(Stack)是限定仅在表尾进行插入和删除操作的线性表,如铁路调度。如下 图:

(二)栈的的表现形式
栈有两种表示形式:栈的表示和实现、栈的 链式表示。
1.栈的表示和实现
利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。如下图:

同时设置栈顶指针(top)和栈底指针(base)。当 top = base 表示栈空;增加一 个元素,top 增加 1;删除栈顶元素,top 减 1。非空栈顶指针始终在始终在栈顶元素 的下一个位置。
2.栈的链式表示
当栈的长度无法估计时最好用栈的链式表示,如下图所示。

结点包含数据元素和指针两个数据域。
(三)栈的链式表示时元素压入、弹出 算法实现思路
1.栈的线性链表的压入算法
压入算法过程为:定义新的结点 p、修改新结 点的指针(指向原栈顶结点 top)、给新结点 p 赋 值为 x、修改新栈顶的指针(指向新结点 p)。
2.栈的线性链表的弹出算法
弹出算法过程为:将栈顶结点 top 赋给 p、取结点 p 的值并赋给 x、调整栈顶位置(指向结点 p 的下一个结点)、释放结点 p 的空间。

(四)算法的实现
栈的顺序存储代码表示(已给出具体代码的注释):
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h> // 定义栈结构体
typedef struct {int data[100]; // 存储栈数据的数组int top; // 栈顶指针int bottom; // 栈底指针
} stack;// 创建栈的函数
stack* StackCreate() {// 开辟存储空间stack* p = (stack*)malloc(sizeof(stack));if (p == NULL)return NULL; // 如果内存分配失败,返回NULLp->bottom = -1; // 初始化bottom为-1,表示栈为空p->top = -1; // 初始化top为-1,表示栈为空return p;
}// 入栈函数,在p栈尾插入a
void StackInput(stack* p, int a) {if (p->top < 99) {++(p->top); // 栈顶指针加一p->data[p->top] = a; // 赋值}else {printf("栈的空间不够了!!!\n");}
}// 出栈函数,在p栈尾出栈,并用a来存储
int StackOutput(stack* p, int* a) {if (p->top != -1) { // 如果栈不为空*a = p->data[p->top]; // 赋值(p->top)--; // 栈顶指针减一return 1; // 成功出栈,返回1}return 0; // 栈为空,返回0
}// 打印栈中所有元素的函数
void Print_function(stack* p) {for (int i = p->top; i >= 0; i--) { // 从栈顶到栈底遍历printf("%d ", p->data[i]); // 打印栈中的元素}printf("\n");
}int main() {int a, n, m;stack* p = StackCreate(); // 创建栈if (p == NULL) {printf("内存分配失败!\n");return 1; // 如果创建栈失败,返回1}printf("请输入入栈个数:");scanf("%d", &n); // 读取入栈的元素个数for (int i = 0; i < n; i++) {printf("请输入第%d个数:", i + 1);scanf("%d", &a); // 读取用户输入的数字StackInput(p, a); // 将数字入栈printf("入栈后:\n");Print_function(p); // 打印当前栈的状态}printf("请输入出栈个数:");scanf("%d", &m); // 读取出栈的元素个数for (int i = 0; i < m; i++) {int element;if (StackOutput(p, &element)) { // 将栈顶元素出栈printf("出栈元素: %d\n", element); // 打印出栈的元素}else {printf("栈已空,无法出栈!\n");}}printf("出栈后:\n");Print_function(p); // 打印当前栈的状态free(p); // 释放栈占用的内存return 0;
}
运行结果:

栈的链式存储代码表示(已给出具体代码的注释):
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h> // 定义链表节点结构体
typedef struct Node {int data; // 存储的数据struct Node* next; // 指向下一个节点的指针
} Node;// 定义栈结构体
typedef struct {Node* top; // 栈顶指针
} stack;
// 创建栈的函数
stack* StackCreate() {stack* p = (stack*)malloc(sizeof(stack));if (p == NULL)return NULL; // 如果内存分配失败,返回NULLp->top = NULL; // 初始化栈顶指针为NULL,表示栈为空return p;
}
// 入栈函数,在p栈顶插入a
void StackInput(stack* p, int a) {Node* new_node = (Node*)malloc(sizeof(Node));if (new_node == NULL) {printf("内存分配失败!\n");return;}new_node->data = a; new_node->next = p->top; // 新节点的next指针指向当前栈顶p->top = new_node; // 更新栈顶指针
}
// 出栈函数,在p栈顶出栈,并用a来存储
int StackOutput(stack* p, int* a) {if (p->top == NULL) { return 0; // 返回0表示失败}Node* temp = p->top; // 临时指针指向栈顶节点*a = temp->data; p->top = temp->next; // 更新栈顶指针free(temp); // 释放栈顶节点的内存return 1; // 成功出栈,返回1
}
// 打印栈中所有元素的函数
void Print_function(stack* p) {Node* current = p->top; // 从栈顶开始遍历while (current != NULL) {printf("%d ", current->data); // 打印栈中的元素current = current->next; // 移动到下一个节点}printf("\n");
}
int main() {int a, n, m;stack* p = StackCreate(); // 创建栈if (p == NULL) {printf("内存分配失败!\n");return 1; // 如果创建栈失败,返回1}printf("请输入入栈个数:");scanf("%d", &n); // 读取入栈的元素个数for (int i = 0; i < n; i++) {printf("请输入第%d个数:", i + 1);scanf("%d", &a); // 读取用户输入的数字StackInput(p, a); // 将数字入栈printf("入栈后:\n");Print_function(p); // 打印当前栈的状态}printf("请输入出栈个数:");scanf("%d", &m); // 读取出栈的元素个数for (int i = 0; i < m; i++) {int element;if (StackOutput(p, &element)) { // 将栈顶元素出栈printf("出栈元素: %d\n", element); // 打印出栈的元素}else {printf("栈已空,无法出栈!\n");}}printf("出栈后:\n");Print_function(p); // 打印当前栈的状态// 释放栈中所有节点的内存Node* current = p->top;while (current != NULL) {Node* temp = current;current = current->next;free(temp);}free(p); // 释放栈结构体的内存return 0;
}
运行结果:

最后。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
听说点赞、收藏加关注的人都能长命千岁,万事如意。。。。。。。。。。。。。。。。。。。。
相关文章:
C语言数据结构与算法--简单实现栈的出栈与入栈
(一)栈的基本概念 栈(Stack)是限定仅在表尾进行插入和删除操作的线性表,如铁路调度。如下 图: (二)栈的的表现形式 栈有两种表示形式:栈的表示和实现、栈的 链式表示。 1.栈的表示和…...
单片机智能家居火灾环境安全检测-分享
目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 电路图采用Altium Designer进行设计: 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 传统的火灾报警系统大多依赖于简单的烟雾探测器或温度传感器,…...
python FastAPI 后台运行
最近需要用python把AI的能力封装起来,通过暴露API的方式供别的服务来调用。整体的想法是,选择对应接口,接口读取传入的sql语句,自动去数据库读取数据,运算后将结果在存放在数据库中。 搭建FastAPI框架,由于…...
Java开发者必备:23种设计模式全面解析
文章目录 一、创建型模式1、工厂模式简单工厂工厂方法 2、抽象工厂模式3、原型模式4、建造者模式5、单例模式 二、结构型模式1、适配器模式2、桥接模式3、组合模式4、装饰模式5、外观模式6、享元模式7、代理模式 三、行为型模式1、解释器模式2、模板方法模式3、策略模式4、观察…...
编译OpenWrt步骤
实验平台搭建 硬件平台:hilink-7628n核心板 宿主机系统:ubuntu20.04 server 宿主机安装所需工具: binutils bzip2 diff find flex gawk gcc-6 getopt grep install libc-dev libz-dev make4.1 perl python3.7 rsync subversion unzip whi…...
Linux:confluence8.5.9的部署(下载+安装+pojie)离线部署全流程 遇到的问题
原文地址Linux:confluence8.5.9的部署(下载安装破ji)离线部署全流程_atlassian-agent-v1.3.1.zip-CSDN博客 背景:个人使用2核4g 内存扛不住 总是卡住,但是流程通了所以 直接公司开服务器干生产 个人是centos7 公司…...
✅✅✅【Vue.js】sd.js基于jQuery Ajax最新原生完整版for凯哥API版本
api.js //封装ajax方法 import $g from "../sg";//vue项目使用 import $ from jquery;//(提示:原生开发页面请前往https://jquery.com下载最新版jQuery) import { Message } from "element-ui";//element项目使用 // import axios from "…...
axios 请求跨域问题
文章目录 1. 使用场景2. 解决办法 1. 使用场景 ① 编写后端测试接口,Vue-CLI 的默认端口为 8080,所以为避免端口冲突,我们后端的端口号换成 8081。 ② 前端通过 axios 向后端服务发起请求。 <script> import axios from axios export…...
什么是 Faiss?
好的,我来详细解释 Faiss,它的用途、使用场景,以及如何安装和使用。 什么是 Faiss? Faiss 是由 Facebook AI Research 开发的一个开源库,专门用于高效的相似性搜索和聚类。它非常擅长在高维向量空间中进行快速搜索&a…...
24.UE5枚举,怪物分类,龙卷风技能
2-26 枚举、怪物分类、龙旋风技能、掉落概率_哔哩哔哩_bilibili 目录 1.枚举 1.1枚举类型的创建 1.2 将枚举类型绑定到怪物蓝图上 1.3枚举类型的使用 1.3.1创建新的掉落物 1.3.2更改怪物掉落逻辑 2.龙卷风技能 2.1输入映射 2.2龙卷风发射物的创建 2.3龙卷风伤害逻辑…...
什麼是ISP提供的公共IP地址?
公共IP地址是ISP分配給設備或網路的全球唯一地址。此地址允許通過互聯網識別和訪問設備。ISP提供的公共IP地址具有幾個關鍵特徵: 1.每個公網IP在全球網路內都是唯一的,避免衝突。 2. 公共 IP 地址對其他網路可見,並且可用於地理定位設備。 …...
git操作总结
git基本知识 工作区域 远程仓库: 就是我们托管在github或者其他代码托管平台上的仓库。本地仓库: 就是在我们本地通过git init命令初始化的新建的仓库。工作区: 就是我们写代码、编辑文件的地方。暂存区: 当工作区的内容写好了之…...
CompressAI安装!!!
我就不说废话了,直接给教程,还是非常简单的 但是我看了好多帖子,都没有说明情况 一定要看最后最后的那个注释 正片开始: 一共有三种方式: 第一种就是本机安装: 在网址上下载对应版本Links for compre…...
豆包MarsCode算法题:最小周长巧克力板组合
问题描述 思路分析 这道题可以抽象为一个最优化问题: 问题分析 每个正方形的面积为 k ,对应的边长为 k ,周长为 4k 。给定整数 n ,我们需要找到若干正方形,使得它们的面积之和恰好等于 n: 同时尽量最小…...
vue项目添加骨架屏vue-skeleton-webpack-plugin,通过app.vue添加骨架屏,解决衔接空白问题
安装插件 yarn add vue-skeleton-webpack-plugin在 webpack 中引入插件:以4版本为例配置如下 vue.config.js plugins: [new SkeletonWebpackPlugin({webpackConfig: {entry: {app: path.join(__dirname, ./src/components/entry-skeleton.js),},},minimize: true,…...
测试实项中的偶必现难测bug之模糊匹配逻辑
问题: 现在有一个场景,如果只是通过功能测试会比较难测,例如刚开始我们做会员的时候,只有白银会员,在用户分群的场景下,需要用条件逻辑匹配,当时开发用了like的匹配方式没有问题。1年后加了白银试用会员,导致在统计会员分群的时候明明条件选的是白银会员,但是统计的数…...
Vue:后端返回二进制文件,前端如何实现浏览器自动下载?
Vue项目开发中,遇到界面下载功能时,前端如何实现将后端返回二进制文件在浏览器自动下载? 一、关键代码: export function downloadFile(fileName) {axios({method: post,url: process.env.VUE_APP_BASE_API /cgi-bin/file,data:…...
Android解压zip文件到指定目录
很多时候需要把一个预制的zip文件解压到根目录,下面是一个实例代码: private static final int BUFFER_SIZE 4096;public static void unZip(String zipFilePath, String targetDir) throws IOException {File destDir new File(targetDir);if (!destD…...
主要用于图像的颜色提取、替换以及区域修改
这段代码涉及了以下几个关键步骤,主要用于图像的颜色提取、替换以及区域修改。下面是对代码的详细解析: 1. 导入库 import cv2 import matplotlib.pyplot as plt import numpy as npcv2: OpenCV库,用于图像处理。matplotlib.pyplot: 用于绘…...
gbase8c之运维操作
导出结构: gs_dump -U gbase8s -W Password123 -f /tmp/dump_only_structure.sql -p 15400 sids_station -n public -s -F p 导出数据: gs_dump -U gbase8s -W Password123 -f /tmp/dump_only_data.sql -p 15400 sids_station -n public -a -F p 导入…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...
热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...
ui框架-文件列表展示
ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...
