数据结构-------栈

news2025/3/20 5:25:37

顺序栈:

一、数据结构定义

  1. 数据元素 DATATYPE
typedef struct person {
    char name[32];
    char sex;
    int age;
    int score;
} DATATYPE;
  1. 顺序栈结构 SeqStack
typedef struct list {
    DATATYPE *head;  // 栈空间首地址
    int tlen;        // 栈总容量(total length)
    int top;         // 栈顶指针(相当于当前元素计数)
} SeqStack;

二、核心操作接口

  1. 创建栈
SeqStack *CreateSeqStack(int size)
{
    SeqStack *ss = malloc(sizeof(SeqStack));
    if (NULL == ss)
    {
        perror("CreateSeqStack malloc error\n");
        return NULL;
    }
    ss->head = malloc(sizeof(DATATYPE) * size);
    if (NULL == ss)
    {
        perror("CreateSeqStack malloc2 error\n");
        return NULL;
    }
    ss->tlen = size;
    ss->top = 0;
    return ss;
}
  • 实现要点:
    • 动态分配结构体内存
    • 分配连续存储空间:head = malloc(size * sizeof(DATATYPE))
    • 初始化tlen = sizetop = 0
  1. 销毁栈
int DestroySeqStack(SeqStack *ss)
{
    if (NULL == ss)
    {
        fprintf(stderr, "DestroySeqStack pamter error\n");
        return 1;
    }
    free(ss->head);
    free(ss);
    return 0;
}
  • 内存释放顺序:
    1. 释放数据空间 free(ss->head)
    2. 释放控制结构 free(ss)
  1. 入栈操作
int PushSeqStack(SeqStack *ss, DATATYPE *data) // add
{
    if (NULL == ss || NULL == data || IsFullSeqStack(ss))
    {
        fprintf(stderr, "PushSeqStack pamter error\n");
        return 1;
    }
    memcpy(&ss->head[ss->top], data, sizeof(DATATYPE));
    ss->top++;
    return 0;
}
  • 实现流程:
if 栈未满:
    复制数据到ss->head[top]位置
    top++
    返回成功
else:
    返回失败
  1. 出栈操作
int PopSeqStack(SeqStack *ss)
{
    if (NULL == ss)
    {
        fprintf(stderr, "PopSeqStack pamter error\n");
        return 1;
    }
    ss->top--;
    return 0;
}
  • 实现逻辑:
if 栈非空:
    top--
    返回成功
else:
    返回失败
  1. 判空操作
int IsEmpySeqStack(SeqStack *ss)
{
    return 0 == ss->top;
}
  • 判断条件:top == 0
  1. 判满操作
int IsFullSeqStack(SeqStack *ss)
{
    return ss->tlen == ss->top;
}
  • 判断条件:top == tlen
  1. 获取栈顶元素
DATATYPE *GetTopSeqStack(SeqStack *ss)
{
    if (NULL == ss || IsEmpySeqStack(ss))
    {
        fprintf(stderr, "GetTopSeqStack pamter error\n");
        return NULL;
    }
    return &ss->head[ss->top - 1];
}
  • 注意点:
    • 返回ss->head[top-1]的地址
    • 需先判断栈是否为空
  1. 获取栈大小
int GetSizeSeqStack(SeqStack *ss)
{
    if (NULL == ss )
    {
        fprintf(stderr, "GetSizeSeqStack pamter error\n");
        return 1;
    }
    return ss->top;
}
  • 直接返回top

三、存储结构示意图

栈底 → head[0]
       head[1]
       ...
栈顶 → head[top-1]  ← 当前有效元素
       head[top]    ← 下一个可用位置(当top<tlen时)
       ...
       head[tlen-1]

四、时间复杂度分析

操作时间复杂度说明
创建栈O(1)内存分配操作
销毁栈O(1)内存释放操作
入栈/出栈O(1)直接操作栈顶指针
获取栈顶元素O(1)随机访问特性
获取栈大小O(1)直接读取top值

五、优势与局限

  1. 优势

    • 随机访问特性,支持快速定位
    • 内存连续,缓存命中率高
    • 操作时间复杂度均为O(1)
  2. 局限

    • 固定容量,需要预先分配空间
    • 扩容成本高(需要重新分配内存)
    • 可能产生空间浪费(分配未使用的空间)

六、典型应用场景

  1. 函数调用栈的实现
  2. 表达式求值(中缀转后缀表达式)
  3. 括号匹配检测
  4. 浏览器的后退操作栈
  5. 撤销/重做功能实现

七、实现注意事项

  1. 内存管理

    • 创建时需分配两次内存(控制结构+数据空间)
    • 销毁时需按相反顺序释放
  2. 临界条件处理

    • 入栈前必须检查栈是否已满
    • 出栈前必须检查栈是否为空
    • 获取栈顶元素前必须检查非空

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

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

相关文章

机器学习概要

文章目录 一、什么是机器学习 二、机器学习的种类 1. 有监督学习 2. 无监督学习 3.强化学习 三、机器学习的应用 四、机器学习的步骤 1. 数据的重要性 2. 数据和学习的种类 3. 可视化 一、什么是机器学习 机器学习指的是计算机根据给定的问题、课题或环境进行学习&a…

【LangChain入门 2 Model组件】开始!LLM Models简单对话

文章目录 一、使用langchain_ollama二、采用DeepSeek的API三、Model 介绍3.1 OllamaLLM 预训练模型3.2 ChatOllama 聊天预训练模型3.3 OllamaEmbeddings 实现一个helloworld&#xff0c;跑通一个简单的对话。 后面章节会正式介绍LangChain的各个功能。 后台llm的端口可以任意选…

C++20 中线程管理与取消机制的深度剖析

文章目录 std::jthread&#xff1a;更智能的线程管理背景与优势构造函数与 std::stop_token 的集成 std::stop_token、std::stop_source 和 std::stop_callback&#xff1a;灵活的取消机制std::stop_token&#xff1a;取消请求的指示器std::stop_source&#xff1a;取消请求的发…

Vue3 核心特性解析:Suspense 与 Teleport 原理深度剖析

Vue3 核心特性解析&#xff1a;Suspense 与 Teleport 原理深度剖析 一、Teleport&#xff1a;突破组件层级的时空传送 1.1 实现原理图解 #mermaid-svg-75dTmiektg1XNS13 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-s…

FPGA——实现LED流水灯

文章目录 一、Quartusll_18.1和VS Code软件的关联二、DE2-115的时钟电路三、流水灯的分层次设计四、总结 一、Quartusll_18.1和VS Code软件的关联 1.先打开Quartus II 软件&#xff0c;然后选择菜单栏“Tools”下的“Options…”。 2.点击“Options…”&#xff0c;在弹出的对…

Excel 小黑第12套

对应大猫13 涉及金额修改 -数字组 -修改会计专用 VLOOKUP函数使用&#xff08;查找目标&#xff0c;查找范围&#xff08;F4 绝对引用&#xff09;&#xff0c;返回值的所在列数&#xff0c;精确查找或模糊查找&#xff09;双击填充柄就会显示所有值 这个逗号要中文的不能英…

滚动元素的新api

点击的时候需要双重视图滚动 itemClick(id) {// 滚动到对应位置this.$nextTick(() > {// 找到对应 id 在 initList2 中的索引const index this.initList2.findIndex((item) > item.id Number(id));if (index ! -1) {// 获取所有菜单项const menuItems document.queryS…

多机调度问题(C语言)

代码如下&#xff1a; #include<stdio.h> #include<stdlib.h>int compare(void* a, void* b)//比较函数&#xff0c;用于qsort按处理时间从大到小排序 {return *(int*)a - *(int*)b; }int LPT(int jobs[], int n, int m)//多机调度问题的LPT算法 {qsort(jobs, n, …

烽火HG680-KB_海思HI3798MV310_安卓9.0_U盘强刷固件包及注意点说明

之前发布过这个固件包&#xff0c;关于烽火HG680-KA&#xff0f;HG680-KB_海思HI3798MV310_安卓9.0_U盘强刷固件包详细说明一下&#xff0c;汇总总结一些常遇到的情况&#xff0c;这次固件会分开发布&#xff0c;以免混淆。 上一个帖子地址&#xff1a;烽火HG680-KA&#xff0…

996引擎 - 红点系统

996引擎 - 红点系统 总结NPC 红点(TXT红点)Lua 红点1. Red_Point.lua2. UI_Ex.lua参考资料以下内容是在三端 lua 环境下测试的 总结 红点系统分几个部分组成。 M2中设置变量推送。 配置红点表。 Envir\Data\cfg_redpoint.xls 2.1. UI元素中找到ID填写 ids 列。 主界面挂载…

3.17BUUCTF练习day1

BUUCTF练习day1 [极客大挑战 2019]EasySQL1&#xff08;字符型&#xff0c;账号密码型&#xff0c;get型&#xff09; 判断闭合方式 在用户名输入1‘&#xff0c;此时密码先输入任何数字时&#xff0c;出现语法错误 说明闭合方式为单引号闭合&#xff0c;在判断完闭合方式后…

【贪心算法】柠檬水找零

1.题目解析 860. 柠檬水找零 - 力扣&#xff08;LeetCode&#xff09; 2.讲解算法原理 分情况讨论 5---》直接收下 10---》找五元&#xff0c;收下 20----》105△ ----》555 由于5元更有用&#xff0c;则尽可能保留5元 3.代码 class Solution {public boolean lemonadeCh…

黑马跟学.苍穹外卖.Day08

黑马跟学.苍穹外卖.Day08 苍穹外卖-day8课程内容1. 工作台1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计 1.2 代码导入1.2.1 Controller层1.2.2 Service层接口1.2.3 Service层实现类1.2.4 Mapper层 1.3 功能测试1.3.1 接口文档测试1.3.2 前后端联调测试 1.4 代码提交 2. Ap…

ABAP语言的动态编程(4) - 综合案例:管理费用明细表

本篇来实现一个综合案例&#xff1a;管理费用明细表。报表在实际项目中&#xff0c;也有一定的参考意义&#xff0c;一方面展示类似的报表&#xff0c;比如管理费用、研发费用等费用的明细&#xff0c;使用业务比较习惯的展示格式&#xff1b;另一方面正好综合运用前面学习的动…

通过Geopandas进行地理空间数据可视化

目录 引言 安装与导入 数据加载与探索 数据预处理 基本地图可视化 添加其他数据到地图上 空间分析与查询 地图叠加与分组 空间缓冲区 交互式地图可视化 实际应用案例 城市规划 环境监测 结论 引言 在数据科学领域,地理空间数据可视化扮演着至关重要的角色。它不…

在Vue3中使用Echarts的示例

1.常用-引用ts文件方式 1.1 导出ts文件-一个简单的柱状图 export const baseBarChart (xdata: string[], data: number[][], legendData: string[]) > {if (data.length 0) {return noData;}// 定义颜色数组const color [#00CCCC,#FF9900,#1677DC,#FF6666,#B366FF,#666…

GHCTF web方向题解

upload?SSTI! import os import refrom flask import Flask, request, jsonify,render_template_string,send_from_directory, abort,redirect from werkzeug.utils import secure_filename import os from werkzeug.utils import secure_filenameapp Flask(__name__)# 配置…

Logic-RL:小参数qwen模型复现DeepSeek R1 zero

最近很多参照DeepSeek模型训练推理模型的工作,本文将深入 “Logic-RL: Unleashing LLM Reasoning with Rule-Based Reinforcement Learning” 的论文,该论文提出了一种Rule-Based Reinforcement Learning, Logic-RL框架,旨在提升 LLM 的逻辑推理能力,在qwen2.5-7b-instruct…

CVE-2017-5645(使用 docker 搭建)

介绍: 是一个与 Apache Log4j2 相关的安全漏洞,属于远程代码执行,它可能允许攻击者通过构造恶意的日志信息 在目标系统上执行任意代码 Log4j2 介绍 Log4j2 是 Apache 的一个日志记录工具,属于 Java 应用的日志框架,它是 Log4j 的升级版,性能更好,功能更多.它被广泛的适用于 J…

蓝桥杯备考:特殊01背包问题——》集合subset

我们划分成两个集合&#xff0c;实际上我们只需要看一部分就行了&#xff0c;也就是从集合的所有元素里挑出恰好满足集合总和的一半儿&#xff0c;当然&#xff0c;如果我们的集合总和是奇数的话&#xff0c;我们是无论如何也挑不出刚好一半儿的&#xff0c;因为我们没有小数&a…