C语言数据结构栈的概念及结构、栈的实现、栈的初始化、销毁栈、入栈、出栈、检查是否为空、获取栈顶元素、获取有效元素个数等的介绍

文章目录

  • 前言
  • 栈的概念及结构
  • 栈的实现
  • 一、 栈结构创建
  • 二、 初始化结构
  • 三、销毁栈
  • 四、入栈
  • 五、出栈
  • 六、检查是否为空
  • 七、获取栈顶元素
  • 八、获取有效元素的个数
  • 九、测试 1
  • 十、测试 2
  • 总结

前言

C语言数据结构栈的概念及结构、栈的实现、栈的初始化、销毁栈、入栈、出栈、检查是否为空、获取栈顶元素、获取有效元素个数等的介绍


栈的概念及结构

  • 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

  • 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶

  • 出栈:栈的删除操作叫做出栈。出数据也在栈顶

在这里插入图片描述

栈的实现

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。

在这里插入图片描述

一、 栈结构创建

栈结构的创建

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>// 动态增长的栈
typedef int STDataType;
typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;

二、 初始化结构

初始化结构定义

// 初始化栈
void STInit(ST* ps)
{assert(ps);ps->a = (STDataType*)malloc(sizeof(STDataType) * 4);if (ps->a == NULL){perror("STInit malloc");return;}ps->top = 0; // top指的是栈顶元素的下一个位置//ps->top = -1; // top 指的是栈顶元素ps->capacity = 4;
}

三、销毁栈

销毁栈定义

// 销毁栈
void STDestroy(ST* ps)
{assert(ps);free(ps->a);ps->a == NULL;ps->top = 0;ps->capacity = 0;
}

四、入栈

入栈定义

// 入栈
void STPush(ST* ps, STDataType x)
{assert(ps);if (ps->top == ps->capacity){STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * ps->capacity * 2);if (tmp == NULL){perror("STPush relloc");return;}ps->a = tmp;ps->capacity *= 2;}ps->a[ps->top] = x;ps->top++;
}

五、出栈

出栈定义

// 出栈
void STPop(ST* ps)
{assert(ps);assert(!STEmpty(ps));ps->top--;
}

六、检查是否为空

检查是否为空定义

// 检查是否为空
bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}

七、获取栈顶元素

获取栈顶元素定义

// 获取栈顶元素
STDataType STTop(ST* ps)
{assert(ps);assert(!STEmpty(ps));return ps->a[ps->top - 1];
}

八、获取有效元素的个数

获取有效元素的个数定义

// 获取有效元素的个数
int STSize(ST* ps)
{assert(ps);return ps->top;
}

九、测试 1

测试1

#include "Stack.h"int main()
{ST st;// 初始化栈STInit(&st);// 入栈STPush(&st, 1);STPush(&st, 2);STPush(&st, 3);STPush(&st, 4);// 栈内元素打印while (!STEmpty(&st)){// 打印栈顶元素printf("%d ", STTop(&st));// 出栈STPop(&st);}// 销毁栈STDestroy(&st);return 0;
}

效果如下:
在这里插入图片描述

十、测试 2

测试2

#include "Stack.h"int main()
{ST st;// 初始化栈STInit(&st);// 入栈STPush(&st, 1);STPush(&st, 2);printf("%d ", STTop(&st));STPop(&st);STPush(&st, 3);STPush(&st, 4);printf("%d ", STTop(&st));STPop(&st);STPush(&st, 5);// 栈内元素打印while (!STEmpty(&st)){printf("%d ", STTop(&st));// 出栈STPop(&st);}// 销毁栈STDestroy(&st);return 0;
}

效果如下:
在这里插入图片描述


总结

C语言数据结构栈的概念及结构、栈的实现、栈的初始化、销毁栈、入栈、出栈、检查是否为空、获取栈顶元素、获取有效元素个数等的介绍

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

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

相关文章

意外发现openGauss兼容Oracle的几个条件表达式

意外发现openGauss兼容Oracle的几个条件表达式 最近工作中发现openGauss在兼容oracle模式下&#xff0c;可以兼容常用的两个表达式&#xff0c;因此就随手测试了一下。 查看数据库版本 [ommopenGauss ~]$ gsql -r gsql ((openGauss 6.0.0-RC1 build ed7f8e37) compiled at 2…

数据结构----堆的实现(附代码)

当大家看了鄙人的上一篇博客栈后&#xff0c;稍微猜一下应该知道鄙人下一篇想写的博客就是堆了吧。毕竟堆栈在C语言中常常是一起出现的。那么堆是什么&#xff0c;是如何实现的嘞。接下来我就带大家去尝试实现一下堆。 堆的含义 首先我们要写出一个堆&#xff0c;那么我们就需…

kubernetes之prometheus kube-controller-manager。 scheduler报错问题

项目场景&#xff1a; prometheus scheduler及kube-controller-manager监控报错 问题描述 kubeadm搭建完kube-prometheus 会有这个报错 原因分析&#xff1a; rootmaster2:~# kubectl describe servicemonitor -n kube-system kube-controller-manager通过以上图片我们发现 k…

php TP8 阿里云短信服务SDKV 2.0

安装&#xff1a;composer require alibabacloud/dysmsapi-20170525 2.0.24 官方文档&#xff1a;短信服务_SDK中心-阿里云OpenAPI开发者门户 (aliyun.com) 特别注意&#xff1a;传入参数获得值形式 正确&#xff1a; $PhoneNumbers $postData[PhoneNumbers];$signName $po…

React Native 之 动画Animated(十一)

react-native 的 Animated API提供了一种声明式的方式来创建平滑的动画效果。它允许你编写动画逻辑&#xff0c;并将动画值直接绑定到组件的样式或布局属性上。 react-native 的 Animated 库通过以下方式工作&#xff1a; 创建动画值&#xff1a;首先&#xff0c;你需要使用 A…

单片机设计注意事项

1.电源线可以30mil走线&#xff0c;信号线可以6mil走线 2.LDO推荐 SGM2019-3.3,RT9013,RT9193,1117-3.3V。 3.单片机VCC要充分滤波后再供电&#xff0c;可以接0.1uf的电容 4.晶振附件不要走其他元件&#xff0c;且放置完单片机后就放置晶振&#xff0c;晶振靠近X1,X2。

【全网最全】2024电工杯数学建模A题前三题完整解答matlab+21页初步参考论文+py代码等(后续会更新成品论文)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片链接&#xff0c;那是获取资料的入口&#xff01; 【全网最全】2024电工杯数学建模A题前三题完整解答matlab21页初步参考论文py代码等&#xff08;后续会更新成品论文&#xff09;「首先来看看目前已有的…

二叉树—先后序线索化和先后序线索遍历

有了上篇文章的基础&#xff0c;先序和后序的线索化逻辑一样。 代码如下&#xff1a; void preOrderThreadTree(TreeNode* T,TreeNode** pre) {if (T NULL) {;}else {//printf("%c ", T->val);if (T->lchild NULL) {T->ltag 1;T->lchild *pre;}if …

计算机笔记14(续20个)

230.色彩的种类就是色相 饱和度就是彩度除以明度 231.RISC是精简指令集&#xff0c;CISC是复杂指令集 232.世界上第一台数字计算机&#xff0c;奠定了至今仍在使用计算机体系结构 233.数据传输中&#xff0c;电路交换的传输延迟最小 234.定点整数的小数点约定在最低…

CTF-web-攻防世界-3

1、inget (1)、进入网站&#xff0c;提示传入id值 (2)、用一些闭合方式&#xff0c;返回都一样。 (3)、尝试万能密码。获得flag 2、mfw (1)、页面没有什么特殊的异常&#xff0c;使用dirsearch进行目录扫描&#xff0c;有一些.git文件。看样子是.git文件泄露。 使用githa…

7款好用到离谱的神级App推荐!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 转眼间&#xff0c;2024年已经是下个月。最近有很多小伙伴的咨询&#xff0c;我也赶紧整理了7款好用的软件&#xff0c;希望对大家有所帮助。 …

Git简介以及下载安装和配置

Git介绍 什么是版本控制?什么是Git?什么是集中式版本控制(了解)分布式版本控制工作流程 Git的安装与配置注册邮箱以及用户名(方便远程使用)初始化项目Git在ideal上的使用(本地) 什么是版本控制? ​ 版本控制是指对软件开发过程中各种程序代码,控制文件及说明文档等文件变更…

【C语言实现线程池】

创建一个线程池是提高多线程应用程序性能的有效方法。一个线程池中包含一定数量的工作线程&#xff0c;这些线程可以复用来处理多个任务&#xff0c;避免了频繁创建和销毁线程所带来的开销。 下面是一个基础的线程池实现的框架&#xff0c;使用C语言和POSIX线程库(pthread)。这…

lodash已死?radash库方法介绍及源码解析 —— 对象方法篇

assign&#xff1a;递归合并两个对象 使用说明 功能说明&#xff1a;类似于 JavaScript 的 Object.assign 方法&#xff0c;用于将 override 对象的属性和值复制到 initial 对象中。如果属性值是对象&#xff0c;则递归地进行赋值。 参数&#xff1a;初始对象、覆盖对象。 返…

清理mysql binglog文件

mysql随着使用时间的推移&#xff0c;binglog文件会越来越大&#xff0c;比如我们的oa系统&#xff0c;上线4年多了&#xff0c;最近总有磁盘空间满影响系统正常使用的情况出现。检查后发现binglog是罪归祸首。 binglog文件最好不要采用应删除的方式清理&#xff0c;如下方式可…

LLVM Visual Studio构建

cd llvm-project-main cmake -S llvm -B build -G "Visual Studio 16 2019" -DLLVM_ENABLE_PROJECTSclang-tools-extra -DLLVM_ENABLE_PROJECTSclang .

spring cache(三)demo

一、入门demo 1、pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.o…

ACL组网实验(华为)

思科设备参考&#xff1a;ACL组网实验&#xff08;思科&#xff09; 更多内容参考&#xff1a;华为ACL配置&#xff08;基本ACL高级ACL综合应用&#xff09; 技术简介 ACL&#xff08;Access Control List&#xff09;技术是一种基于包过滤的流控制技术&#xff0c;主要用于…

ML307R OpenCPU UART使用

一、串口使用流程图 二、串口相关函数介绍 三、实现串口收发 一、串口使用流程图 OneMO ML307R模组提供了2路UART给开发者用于通讯开发&#xff0c;以及1路DBG UART用于log的打印。UART Demo示例可以在SDK&#xff1a;examples\uart\src\cm_demo_uart.c中查看。 串口使用流…