当前位置: 首页 > 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 导入…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...

jdbc查询mysql数据库时,出现id顺序错误的情况

我在repository中的查询语句如下所示&#xff0c;即传入一个List<intager>的数据&#xff0c;返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致&#xff0c;会导致返回的id是从小到大排列的&#xff0c;但我不希望这样。 Query("SELECT NEW com…...

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

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

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》

近日&#xff0c;嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》&#xff0c;海云安高敏捷信创白盒&#xff08;SCAP&#xff09;成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天&#xff0c;网络安全已成为企业生存与发展的核心基石&#xff0c;为了解…...