栈结构(c语言)
1.栈的概念
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶
2.栈结构的特点:
- 后进先出(LIFO):栈的最显著特点是后进先出的数据访问方式。也就是说,最后添加到栈中的元素会首先被移除,而最先添加的元素会被保留在栈的底部,直到后续被移除。
- 限制性访问:栈通常只允许在栈顶进行操作,包括添加元素(入栈)和移除元素(出栈)。这种限制性访问确保了数据的一致性和有效性,因为只有最顶端的元素才是可见和可访问的。
- 基于顺序存储或链式存储:栈可以基于顺序存储(如数组和顺序表)或链式存储(如链表)实现。在顺序存储中,栈的元素被连续存储在内存中的一个连续区域,并且栈顶的位置可以随着入栈和出栈操作进行动态调整。而在链式存储中,每个元素都有一个指向下一个元素的指针,形成了一个链式结构。
- 常见应用:栈在计算机科学中有着广泛的应用,包括函数调用栈、表达式求值、语法分析、内存管理等方面。在算法和数据结构中,栈也是解决许多问题的重要工具。
- 内存管理:栈内存储在程序的运行时栈空间中,由编译器或解释器负责管理。入栈和出栈操作通常比较高效,并且不会导致内存碎片化。
总的来说,栈是一种简单但功能强大的数据结构,它的后进先出特性使其在许多领域都有着重要的应用。
栈结构通常是用顺序表来实现的,如果学会了顺序表和链表再来实现栈结构就行显得简单的多。
3.栈的实现
3.1头文件的声明
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{STDataType* _a; //栈空间int _top; // 栈顶int _capacity; // 容量
}Stack;
void StackInit(Stack* ps);// 初始化栈
void StackPush(Stack* ps, STDataType data);// 入栈
void StackPop(Stack* ps);// 出栈
STDataType StackTop(Stack* ps);// 获取栈顶元素
int StackSize(Stack* ps);// 获取栈中有效元素个数
int StackEmpty(Stack* ps);// 检测栈是否为空
void StackDestroy(Stack* ps);// 销毁栈
3.2初始化栈
void StackInit(Stack* ps)
{assert(ps);ps->_a = NULL;ps->_top = ps->_capacity = 0;
}
3.3入栈
void StackPush(Stack* ps, STDataType data)
{assert(ps);if (ps->_top == ps->_capacity){int dt = ps->_capacity == 0 ? 4 : ps->_capacity * 2;STDataType* pnew = (STDataType*)realloc(ps->_a, sizeof(STDataType) * dt);//申请栈空间assert(pnew);ps->_a = pnew;ps->_capacity = dt;//更新空间大小}ps->_a[ps->_top] = data;ps->_top++;
}
3.4出栈
void StackPop(Stack* ps)
{assert(ps);assert(ps->_top);ps->_top--;
}
3.5获取栈顶元素
STDataType StackTop(Stack* ps)
{assert(ps);assert(ps->_top);ps->_top--;return ps->_a[ps->_top];
}
3.6判空
// 检测栈是否为空,如果为空返回0结果,如果不为空返回非零
int StackEmpty(Stack* ps)
{assert(ps);return ps->_top == 0 ? 1 : 0;
}
3.7销毁栈
void StackDestroy(Stack* ps)
{assert(ps);free(ps->_a);ps->_a = NULL;ps->_top = ps->_capacity = 0;
}
4.原码
Stack.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{STDataType* _a; //栈空间int _top; // 栈顶int _capacity; // 容量
}Stack;
// 初始化栈
void StackInit(Stack* ps);
// 入栈
void StackPush(Stack* ps, STDataType data);
// 出栈
void StackPop(Stack* ps);
// 获取栈顶元素
STDataType StackTop(Stack* ps);
// 获取栈中有效元素个数
int StackSize(Stack* ps);
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
int StackEmpty(Stack* ps);
// 销毁栈
void StackDestroy(Stack* ps);
Stack.c
#include"Stack.h"
// 初始化栈
void StackInit(Stack* ps)
{assert(ps);ps->_a = NULL;ps->_top = ps->_capacity = 0;
}
// 入栈
void StackPush(Stack* ps, STDataType data)
{assert(ps);if (ps->_top == ps->_capacity){int dt = ps->_capacity == 0 ? 4 : ps->_capacity * 2;STDataType* pnew = (STDataType*)realloc(ps->_a, sizeof(STDataType) * dt);//申请栈空间assert(pnew);ps->_a = pnew;ps->_capacity = dt;//更新空间大小}ps->_a[ps->_top] = data;ps->_top++;
}
// 出栈
void StackPop(Stack* ps)
{assert(ps);assert(ps->_top);ps->_top--;
}
// 获取栈顶元素
STDataType StackTop(Stack* ps)
{assert(ps);assert(ps->_top);ps->_top--;return ps->_a[ps->_top];
}
// 获取栈中有效元素个数
int StackSize(Stack* ps)
{assert(ps);return ps->_top;
}
// 检测栈是否为空,如果为空返回0结果,如果不为空返回非零
int StackEmpty(Stack* ps)
{assert(ps);return ps->_top == 0 ? 1 : 0;
}
// 销毁栈
void StackDestroy(Stack* ps)
{assert(ps);free(ps->_a);ps->_a = NULL;ps->_top = ps->_capacity = 0;
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Stack.h"
int main()
{Stack pst;Stack* pr = &pst;// 初始化栈 StackInit(pr);StackPush(pr, 1);StackPush(pr, 2);StackPush(pr, 3);StackPush(pr, 4);StackPush(pr, 5);StackPush(pr, 6);StackPop(pr);while (!StackEmpty(pr)){printf("%d ", StackTop(pr));}printf("\n%d", StackSize(pr));StackDestroy(pr);return 0;
}
相关文章:

栈结构(c语言)
1.栈的概念 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈&am…...

【C++】C/C++中新const用法:const成员
欢迎来到CILMY23的博客 本篇主题为: C/C中新const用法:const成员 个人主页:CILMY23-CSDN博客 系列专栏:Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux 感谢观看,支持的可以给个一键三连,点赞…...

武汉凯迪正大—钢管焊缝裂纹探伤仪
产品概述 武汉凯迪正大无损探伤仪是一种便携式工业无损探伤仪器, 能够快速便捷、无损伤、精确地进行工件内部多种缺陷(裂纹、夹杂、气孔等)的检测、定位、评估和诊断。既可以用于实验室,也可以用于工程现场。 设置简单,…...
为什么 IP 地址通常以 192.168 开头?
在网络配置中,我们经常会遇到以 192.168 开头的 IP 地址,例如 192.168.0.1 或者 192.168.1.100。 这些地址通常用于局域网中,但为什么要选择以 192.168 开头呢? 本文将深入探讨这个问题,并解释其背后的原因和历史渊源…...
elementUi中的el-table合计行添加点击事件
elementUi 文档中,合计行并没有点击事件,这里自己实现了合计行的点击事件。 created() {this.propertyList [{ property: order, label: 序号 },{ property: deptName, label: 单位名称 },{ property: contentPublishQuantity, label: 文章数量 },{ pro…...
Zookeeper集群搭建的一些问题
问题描述一: Cannot open channel to 2 at election address /192.168.60.132:3888解决方案: 查看zookeeper配置文件zoo.cfg / zoo_sample.cfg中集群配置部分 server.1zoo1-net1:2888:3888|zoo1-net2:2889:3889 server.2zoo2-net1:2888:3888|zoo2-net2…...

【线性代数】俗说矩阵听课笔记
基础解系的概念 线性方程组的解 21行列式和矩阵秩Rank的等价刻画 子式 标准型 利用子式求解矩阵的rank 24零积秩不等式 齐次线性方程组的基础解系 rank的两个重要结论 ¥25伴随矩阵的rank 奇异矩阵:行列式0的矩阵 31线性相关,线性无关&#…...

物联网技术在数字化工厂中的应用,你知道多少?——青创智通
工业物联网解决方案-工业IOT-青创智通 物联网(IoT)技术在数字化工厂的应用正日益成为工业革命的重要推动力。随着科技的飞速发展,物联网技术不断革新,其在数字化工厂中的应用也呈现出愈发广泛和深入的态势。本文将详细探讨物联网…...

nacos开启登录开关启动报错“Unable to start embedded Tomcat”
nacos 版本:2.3.2 2.2.2版本之前的Nacos默认控制台,无论服务端是否开启鉴权,都会存在一个登录页;在之后的版本关闭了默认登录页面,无需登录直接进入控制台操作。在这里我们可以在官网可以看到相关介绍 而我现在所用的…...

Linux|了解如何使用 awk 内置变量
引言 当我们揭开 Awk 功能部分时,我们将介绍 Awk 中内置变量的概念。您可以在 Awk 中使用两种类型的变量:用户定义的变量和内置变量。 内置变量的值已经在 Awk 中定义,但我们也可以仔细更改这些值,内置变量包括: FILEN…...
代码随想录-算法训练营day29【回溯算法05:递增子序列、全排列】
代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 第七章 回溯算法part05* 491.递增子序列 * 46.全排列 * 47.全排列 II详细布置 491.递增子序列 本题和大家刚做过的 90.子集II 非常像,但又很不一样,很容易掉坑里。 https://programmercarl.com…...
704. 二分查找
Problem: 704. 二分查找 🐷我的leetcode主页 文章目录 题目分类思路什么是二分查找如何理解时间复杂度 解题方法Code 题目 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target&a…...
php回车变br、php显示br
在 PHP 中,如果你想将回车符(\n)转换为 HTML 的 <br> 标签来实现换行显示,可以使用内置函数 nl2br()。这个函数会将文本中的换行符替换为 <br> 标签。以下是使用 nl2br() 函数的示例代码: <?php $tex…...

找最大数字-第12届蓝桥杯国赛Python真题解析
[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第60讲。 找最大数字&#…...
蓝桥杯 算法提高 ADV-1170 阶乘测试 python AC
找规律题,遍历i中有几个m就加几,和m的多少次数有关 第一版👇 try:while True:n, m map(int, input().split())ll [i for i in range(1, n 1) if i % m 0]ans len(ll)M mwhile ll:lll []M * mfor i in ll:if i % M 0:lll.append(i)a…...

阿里巴巴杭州全球总部正式启用,创新“减碳大脑”科技减碳 | 最新快讯
来源:封面新闻 封面新闻记者付文超 5 月 10 日,记者获悉,位于未来科技城的阿里巴巴杭州全球总部新园区正式启用,这是阿里巴巴目前最大的综合性办公园区。从空中俯瞰,园区正中央呈现阿里标志性的笑脸 logo,这…...
蓝桥杯国赛练习题真题Java(矩阵计数)
题目描述 一个 NM 的方格矩阵,每一个方格中包含一个字符 O 或者字符 X。 要求矩阵中不存在连续一行 3 个 X 或者连续一列 3 个 X。 问这样的矩阵一共有多少种? 输入描述 输入一行包含两个整数 N,M (1≤N,M≤5)。 输出描述 输出一个整数代表答案。…...

概念解析 | ROC曲线:评估分类模型
注1:本文系"概念解析"系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:ROC曲线的含义和绘制 概念解析 | ROC曲线:评估分类模型 第一部分:通俗解释 在我们的日常生活中,经常会遇到需要做出判断和选择的情况。比如,当你收到一封邮件时…...

数据可视化训练第二天(对比Python与numpy中的ndarray的效率并且可视化表示)
绪论 千里之行始于足下;继续坚持 1.对比Python和numpy的性能 使用魔法指令%timeit进行对比 需求: 实现两个数组的加法数组 A 是 0 到 N-1 数字的平方数组 B 是 0 到 N-1 数字的立方 import numpy as np def numpy_sum(text_num):"""…...

【Java EE】数据库连接池详解
文章目录 🎍数据库连接池🌸Hikari🌸Druid 🍀MySQL开发企业规范⭕总结 🎍数据库连接池 在上⾯Mybatis的讲解中,我们使⽤了数据库连接池技术,避免频繁的创建连接,销毁连接 下⾯我们来了解下数据库连接池 数据库连接池负…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...