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;
}

运行结果:

最后。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

听说点赞、收藏加关注的人都能长命千岁,万事如意。。。。。。。。。。。。。。。。。。。。

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

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

相关文章

人工智能(AI)和机器学习(ML)技术学习流程

目录 人工智能(AI)和机器学习(ML)技术 自然语言处理(NLP): Word2Vec: Seq2Seq(Sequence-to-Sequence): Transformer: 范式、架构和自注意力: 多头注意力: 预训练、微调、提示工程和模型压缩: 上下文学习、思维链、全量微调、量化、剪枝: 思维树、思维…

C++初阶——vector

一、什么是vector vector是表示可变大小的数组的序列容器&#xff0c;就像数组一样&#xff0c;vector也采用连续空间来存储元素。也就是说它的访问和数组一样高效&#xff0c;但是它的大小是动态可变的&#xff0c;并且它的大小会被容器自动处理。 二、vector的构造 常用的构…

移远通信亮相骁龙AI PC生态科技日,以领先的5G及Wi-Fi产品革新PC用户体验

PC作为人们学习、办公、娱乐的重要工具&#xff0c;已经深度融入我们的工作和生活。随着物联网技术的快速发展&#xff0c;以及人们对PC性能要求的逐步提高&#xff0c;AI PC成为了行业发展的重要趋势。 11月7-8日&#xff0c;骁龙AI PC生态科技日在深圳举办。作为高通骁龙的重…

AIGC专栏17——EasyAnimate V5版本详解 应用MMDIT结构,拓展模型规模到12B 支持不同控制输入的控制模型

AIGC专栏17——EasyAnimate V5版本详解 应用MMDIT结构&#xff0c;拓展模型规模到12B 支持不同控制输入的控制模型 学习前言相关地址汇总源码下载地址HF测试链接 测试效果Image to VideoText to Video EasyAnimate详解技术储备Diffusion Transformer (DiT)Stable Diffusion 3Co…

Android Studio | 最新版本配置要求高,JDK运行环境不适配,导致无法启动App

Android Studio 的最新版本配置要求比较高&#xff0c;这时候需要降低插件的版本&#xff0c;才能正常启动项目 build.gradle 文件的 dependencies 部分中&#xff0c;使用 libs 作为一些常用库的别名。这些别名在项目的 gradle.properties 文件或者某个特定的 versions.prope…

ssm093基于Java Web的毕业生就业状况管理系统设计与实现+jsp(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;毕业生就业状况管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本毕业生就业…

el-dialog 设置 水平垂直居中 高度不固定

小记一下&#xff1a; 希望实现不管内容高度多少 el-dialog都能水平垂直居中 效果&#xff1a; css: .form-view-dialog{display: flex;align-items: center;justify-content: center;.el-dialog{margin: 0 auto; }.el-dialog__body{max-height: 75vh; // 可选择 设置一个最…

当AI遇上时尚:未来的衣橱会由机器人来打理吗?

内容概要 在当今这个快速发展的时代&#xff0c;人工智能与时尚的结合正在逐渐改写我们对衣橱管理的认知。传统的衣橱管理常常面临着空间不足、穿搭单调及库存过多等挑战&#xff0c;许多人在挑选服饰时难以做出决策。然而&#xff0c;随着技术的进步&#xff0c;智能推荐和自…

Ubuntu 20.04安装CUDA 11.0、cuDNN 8.0.5

不知道咋弄的ubuntu20.04电脑的cuda驱动丢了&#xff0c;无奈需装PyTorch环境&#xff0c;只有CUDA11.0以上版本才支持Ubuntu20.04&#xff0c;所以安装了CUDA11.0、cuDNN8.0.5 为防止频繁在浏览器检索对应的贴子&#xff0c;今天记录一下。 一. 驱动安装 为防止驱动安装后没…

高德地图通过经纬度查找位置和轨迹回放

1、完整代码自己高德申请key,其他文章有写的 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title><…

C++常用的特性-->day05

友元的拓展语法 声明一个类为另外一个类的友元时&#xff0c;不再需要使用class关键字&#xff0c;并且还可以使用类的别名&#xff08;使用 typedef 或者 using 定义&#xff09;。 #include <iostream> using namespace std;// 类声明 class Tom; // 定义别名 using …

使用docker形式部署jumpserver

文章目录 前言一、背景二、使用步骤1.基础环境准备2.拉取镜像3.进行部署4.备份记录启动命令 前言 记录一下使用docker形式部署jumpserver服务的 一、背景 搭建一个jumpserver的堡垒机&#xff0c;但是发现之前是二进制文件部署的&#xff0c;会在物理机上部署污染环境&#x…

产品经理如何使用项目管理软件推进复杂项目按时上线

前言 相信很多产品同学或多或少都有过这样的经历&#xff1a;平时没有听到任何项目延期风险&#xff0c;但到了计划时间却迟迟无法提测……评审时没有任何argue&#xff0c;提测后发现开发的功能不是自己想要的……费劲九牛二虎之力终于让项目上线了&#xff0c;然而发现成果达…

贪心算法-汽车加油

这道题目描述了一个汽车旅行场景&#xff0c;需要设计一个有效的算法来决定在哪几个加油站停车加油&#xff0c;以便最小化加油次数。题目给出了汽车加满油后的行驶距离n公里&#xff0c;以及沿途若干个加油站的位置。我们需要找出一个方案&#xff0c;使得汽车能够完成整个旅程…

【大数据学习 | HBASE】hbase的读数据流程与hbase读取数据

1. hbase的读数据流程 在解析读取流程之前我们还需要知道两个功能性的组件和HFIle的格式信息 HFILE 存储在hdfs中的hbase文件&#xff0c;这个文件中会存在hbase中的数据以kv类型显示&#xff0c;同时还会存在hbase的元数据信息&#xff0c;包括整个hfile文件的索引大小&…

2024AAAI | DiffRAW: 利用扩散模型从手机RAW图生成单反相机质量的RGB图像

文章标题&#xff1a;《DiffRAW: Leveraging Diffusion Model to Generate DSLR-Comparable Perceptual Quality sRGB from Smartphone RAW Images》 原文链接&#xff1a;DiffRAW 本文是清华大学深圳研究院联合华为发表在AAAI-2024上的论文&#xff08;小声bb&#xff1a;华…

【Linux系统编程】第四十五弹---线程互斥:从问题到解决,深入探索互斥量的原理与实现

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、线程互斥 1.1、见一见多线程访问问题 1.2、解决多线程访问问题 1.2.1、互斥量的接口 1.2.2、互斥量接口的使用 1.2.3、…

【GVN】AWZ算法

AWZ算法的例子依旧来自于RKS的这篇文章《Detecting Equalities of Variables: Combining Efficiency with Precision》。 上面两个图&#xff0c;进行的是如下图所示的循环结构的等价类计算。 为什么得到的结果不是上图而是下图呢&#xff1f;这里其实是因为用到的AWZ的算法…

HBuilder使用虚拟机

按文档的连接一直不成功 没找到Simulator&#xff0c;原来是因为我电脑之前没安装过虚拟机版本 安装模拟器Simulator | uni-app官网 找到settings,左下角安装需要的对应版本的虚拟机就好了&#xff0c;然后重启hb

ubuntu下安装 git 及部署cosyvoice(2)

上一节已经可以了一部分。这一节&#xff0c;主要是让他动起来。 1.第一个错误 (cosyvoice) duyichengduyicheng-computer:~/gitee/CosyVoice$ python webui.py Traceback (most recent call last): File "webui.py", line 17, in <module> import grad…