当前位置: 首页 > news >正文

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语言数据结构与算法--简单实现栈的出栈与入栈

&#xff08;一&#xff09;栈的基本概念 栈(Stack)是限定仅在表尾进行插入和删除操作的线性表&#xff0c;如铁路调度。如下 图&#xff1a; &#xff08;二&#xff09;栈的的表现形式 栈有两种表示形式&#xff1a;栈的表示和实现、栈的 链式表示。 1&#xff0e;栈的表示和…...

单片机智能家居火灾环境安全检测-分享

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 传统的火灾报警系统大多依赖于简单的烟雾探测器或温度传感器&#xff0c;…...

python FastAPI 后台运行

最近需要用python把AI的能力封装起来&#xff0c;通过暴露API的方式供别的服务来调用。整体的想法是&#xff0c;选择对应接口&#xff0c;接口读取传入的sql语句&#xff0c;自动去数据库读取数据&#xff0c;运算后将结果在存放在数据库中。 搭建FastAPI框架&#xff0c;由于…...

Java开发者必备:23种设计模式全面解析

文章目录 一、创建型模式1、工厂模式简单工厂工厂方法 2、抽象工厂模式3、原型模式4、建造者模式5、单例模式 二、结构型模式1、适配器模式2、桥接模式3、组合模式4、装饰模式5、外观模式6、享元模式7、代理模式 三、行为型模式1、解释器模式2、模板方法模式3、策略模式4、观察…...

编译OpenWrt步骤

实验平台搭建 硬件平台&#xff1a;hilink-7628n核心板 宿主机系统&#xff1a;ubuntu20.04 server 宿主机安装所需工具&#xff1a; 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&#xff1a;confluence8.5.9的部署&#xff08;下载安装破ji&#xff09;离线部署全流程_atlassian-agent-v1.3.1.zip-CSDN博客 背景&#xff1a;个人使用2核4g 内存扛不住 总是卡住&#xff0c;但是流程通了所以 直接公司开服务器干生产 个人是centos7 公司…...

✅✅✅【Vue.js】sd.js基于jQuery Ajax最新原生完整版for凯哥API版本

api.js //封装ajax方法 import $g from "../sg";//vue项目使用 import $ from jquery;//(提示&#xff1a;原生开发页面请前往https://jquery.com下载最新版jQuery) import { Message } from "element-ui";//element项目使用 // import axios from "…...

axios 请求跨域问题

文章目录 1. 使用场景2. 解决办法 1. 使用场景 ① 编写后端测试接口&#xff0c;Vue-CLI 的默认端口为 8080&#xff0c;所以为避免端口冲突&#xff0c;我们后端的端口号换成 8081。 ② 前端通过 axios 向后端服务发起请求。 <script> import axios from axios export…...

什么是 Faiss?

好的&#xff0c;我来详细解释 Faiss&#xff0c;它的用途、使用场景&#xff0c;以及如何安装和使用。 什么是 Faiss&#xff1f; Faiss 是由 Facebook AI Research 开发的一个开源库&#xff0c;专门用于高效的相似性搜索和聚类。它非常擅长在高维向量空间中进行快速搜索&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地址具有幾個關鍵特徵&#xff1a; 1.每個公網IP在全球網路內都是唯一的&#xff0c;避免衝突。 2. 公共 IP 地址對其他網路可見&#xff0c;並且可用於地理定位設備。 …...

git操作总结

git基本知识 工作区域 远程仓库&#xff1a; 就是我们托管在github或者其他代码托管平台上的仓库。本地仓库&#xff1a; 就是在我们本地通过git init命令初始化的新建的仓库。工作区&#xff1a; 就是我们写代码、编辑文件的地方。暂存区&#xff1a; 当工作区的内容写好了之…...

CompressAI安装!!!

我就不说废话了&#xff0c;直接给教程&#xff0c;还是非常简单的 但是我看了好多帖子&#xff0c;都没有说明情况 一定要看最后最后的那个注释 正片开始&#xff1a; 一共有三种方式&#xff1a; 第一种就是本机安装&#xff1a; 在网址上下载对应版本Links for compre…...

豆包MarsCode算法题:最小周长巧克力板组合

问题描述 思路分析 这道题可以抽象为一个最优化问题&#xff1a; 问题分析 每个正方形的面积为 k &#xff0c;对应的边长为 k &#xff0c;周长为 4k 。给定整数 n &#xff0c;我们需要找到若干正方形&#xff0c;使得它们的面积之和恰好等于 n&#xff1a; 同时尽量最小…...

vue项目添加骨架屏vue-skeleton-webpack-plugin,通过app.vue添加骨架屏,解决衔接空白问题

安装插件 yarn add vue-skeleton-webpack-plugin在 webpack 中引入插件&#xff1a;以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项目开发中&#xff0c;遇到界面下载功能时&#xff0c;前端如何实现将后端返回二进制文件在浏览器自动下载&#xff1f; 一、关键代码&#xff1a; export function downloadFile(fileName) {axios({method: post,url: process.env.VUE_APP_BASE_API /cgi-bin/file,data:…...

Android解压zip文件到指定目录

很多时候需要把一个预制的zip文件解压到根目录&#xff0c;下面是一个实例代码&#xff1a; private static final int BUFFER_SIZE 4096;public static void unZip(String zipFilePath, String targetDir) throws IOException {File destDir new File(targetDir);if (!destD…...

主要用于图像的颜色提取、替换以及区域修改

这段代码涉及了以下几个关键步骤&#xff0c;主要用于图像的颜色提取、替换以及区域修改。下面是对代码的详细解析&#xff1a; 1. 导入库 import cv2 import matplotlib.pyplot as plt import numpy as npcv2: OpenCV库&#xff0c;用于图像处理。matplotlib.pyplot: 用于绘…...

gbase8c之运维操作

导出结构&#xff1a; gs_dump -U gbase8s -W Password123 -f /tmp/dump_only_structure.sql -p 15400 sids_station -n public -s -F p 导出数据&#xff1a; gs_dump -U gbase8s -W Password123 -f /tmp/dump_only_data.sql -p 15400 sids_station -n public -a -F p 导入…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

恶补电源:1.电桥

一、元器件的选择 搜索并选择电桥&#xff0c;再multisim中选择FWB&#xff0c;就有各种型号的电桥: 电桥是用来干嘛的呢&#xff1f; 它是一个由四个二极管搭成的“桥梁”形状的电路&#xff0c;用来把交流电&#xff08;AC&#xff09;变成直流电&#xff08;DC&#xff09;。…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)

本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢&#xff0c;连接红外测温传感器&#xff0c;可实时精准捕捉宠物体温变化&#xff0c;以便及时发现健康异常&#xff1b;水位检测传感器时刻监测饮用水余量&#xff0c;防止宠物…...