数据结构实验3.1:顺序栈的基本操作与进制转换

文章目录

  • 一,问题描述
  • 二,基本要求
  • 三,算法分析
  • 四,示例代码
  • 五,实验操作
  • 六,运行效果


一,问题描述

在数据处理中,常常会遇到需要对链接存储的线性表进行操作的情况。本次任务聚焦于将链接存储的线性表进行逆置。具体来说,就是要改变线性表中结点的顺序,使得原来的最后一个结点变为新线性表的第 1 个结点,原来倒数第 2 个结点变为新线性表的第 2 个结点,依此类推,从而实现整个线性表的逆置。

二,基本要求

  1. 算法分析与设计:对链表逆置问题进行深入分析,考虑到可能存在带附加表头结点和不带附加表头结点这两种不同情况。对于带附加表头结点的链表,表头结点不存储实际数据,仅作为链表的起始标志,在逆置过程中需要特殊处理,以保证表头结点的位置和指向关系正确;对于不带附加表头结点的链表,逆置时要特别注意第一个结点的处理,以及如何正确更新指针,确保链表的完整性和正确性。分别设计出针对这两种情况的高效算法,明确算法的逻辑步骤和操作流程。
  2. 编写完整上机程序:使用 C++ 语言,根据设计好的算法,编写完整的程序代码。在程序中,要清晰地定义链表的节点结构,包括数据域和指针域。实现链表的创建、逆置以及输出等功能函数,确保函数之间的调用关系正确,代码结构清晰易读。同时,要合理处理内存分配和释放问题,避免内存泄漏。
  3. 设计测试用例并上机验证:精心设计多种测试用例,涵盖不同长度的链表、包含不同数据的链表以及特殊情况(如空链表、只有一个结点的链表等)的链表。通过上机运行程序,输入各种测试用例,观察程序的运行结果,验证程序是否能够正确地对链表进行逆置操作。
  4. 记录测试结果,对测试结果进行分析:详细记录每个测试用例的输入和输出结果,包括链表的原始状态和逆置后的状态。对测试结果进行深入分析,检查程序在不同情况下的运行是否符合预期,是否存在逻辑错误或异常情况。比较带附加表头结点和不带附加表头结点两种情况下算法的执行效率、代码复杂度等方面的差异,总结两种方法的优缺点,为今后在实际应用中选择合适的链表结构和算法提供参考。

三,算法分析

  1. 不带附加表头结点的链表逆置算法
    • 初始化三个指针:prev 指向 NULL,表示当前结点的前一个结点;curr 指向链表的头结点,即第一个实际存储数据的结点;next 用于临时存储 curr 的下一个结点。
    • 遍历链表,在每次循环中,先将 next 指向 curr 的下一个结点,然后将 currnext 指针指向 prev,更新 prevcurrcurrnext
    • curr 变为 NULL 时,说明已经遍历到链表的末尾,此时 prev 指向的就是逆置后链表的头结点,完成逆置操作。
  2. 带附加表头结点的链表逆置算法
    • 同样初始化三个指针:prev 指向附加表头结点;curr 指向附加表头结点的下一个结点,即第一个实际存储数据的结点;next 用于临时存储 curr 的下一个结点。
    • 遍历链表,在每次循环中,先将 next 指向 curr 的下一个结点,然后将 currnext 指针指向 prev,更新 prevcurrcurrnext
    • curr 变为 NULL 时,说明已经遍历到链表的末尾,此时需要将附加表头结点的 next 指针指向 prev,完成逆置操作。注意在整个过程中,附加表头结点始终存在且位置不变,只是其 next 指针指向发生了变化。

四,示例代码

#define STACK_INIT_SIZE  100    // 栈存储空间初始分配量
#define STACKINCREMENT  10     // 栈存储空间分配增量
#define OVERFLOW -1
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0#include "stdio.h"
#include "malloc.h"
#include <stdlib.h>  // 添加这一行,引入 exit 函数的定义typedef int status;
typedef char SelemType;typedef struct {                       // 顺序栈的定义SelemType *base;SelemType *top;int stacksize;
} SqStack;status InitStack(SqStack &S) {        // 构造一个空栈 SS.base = (SelemType *)malloc(STACK_INIT_SIZE * sizeof(SelemType));if (!S.base)exit(OVERFLOW);       // 存储分配失败S.top = S.base;S.stacksize = STACK_INIT_SIZE;return OK;
}status Push(SqStack &S, SelemType e) {// 插入元素 e 为新的栈顶元素if (S.top - S.base >= S.stacksize) {         // 栈满,追加存储空间S.base = (SelemType *)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SelemType));if (!S.base)exit(OVERFLOW);       // 存储分配失败S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;}*(S.top) = e;S.top++;return OK;
}status Pop(SqStack &S, SelemType &e) {// 若栈不空,则删除 S 的栈顶元素,用 e 返回其值,并返回 OK;否则返回 ERRORif (S.top == S.base)return ERROR;S.top--;e = *(S.top);return OK;
}status StackEmpty(SqStack S) {         // 判断栈 S 是否为空if (S.top == S.base)return TRUE;elsereturn FALSE;
}void conversion() {                    // 进制转换// 对于输入的任意一个非负十进制整数,打印输出与其等值的对应的进制数SqStack S;int N, d, ys;SelemType x, e;InitStack(S);                      // 构造空栈while (1) {printf("请输入一个非负十进制数(0结束):");scanf("%d", &N);if (N == 0)break;printf("请输入要转换的进制:");scanf("%d", &d);   // 2、8 或 16 进制while (N) {                    // 输出相应的符号ys = N % d;     // 求余if (ys <= 9)x = ys + '0';elsex = ys - 10 + 'A';Push(S, x);N = N / d;      // 求商}printf("转换所得%d进制数为:", d);while (!StackEmpty(S)) {              // 显示结果Pop(S, e);printf("%c", e);}printf("\n");}
}void main() {conversion();
}    

五,实验操作

1.双击程序图标,启动程序。
在这里插入图片描述

2.新建项目。
在这里插入图片描述
3.选择”空项目“——输入项目名称——单击”确认“按钮。
在这里插入图片描述
4.右击”源文件“——”添加“——选择”新建项“。
在这里插入图片描述

5.选择”C++文件“——输入文件名——单击”添加“按钮。
在这里插入图片描述
6.编写代码。
在这里插入图片描述

7.编译代码。
在这里插入图片描述

8.查看编译结果。
在这里插入图片描述

9.单击绿色小三角,运行项目。
在这里插入图片描述

六,运行效果

1.要求效果。
在这里插入图片描述

2.编写程序,运行效果。
在这里插入图片描述

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

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

相关文章

经典频域分析法(Bode图、Nyquist判据) —— 理论、案例与交互式 GUI 实现

目录 经典频域分析法(Bode图、Nyquist判据) —— 理论、案例与交互式 GUI 实现一、引言二、经典频域分析方法的基本原理2.1 Bode 图分析2.2 Nyquist 判据三、数学建模与公式推导3.1 一阶系统的频域响应3.2 多极系统的 Bode 图绘制3.3 Nyquist 判据的数学描述四、经典频域分析…

Vue知识点(5)-- 动画

CSS 动画是 Vue3 中实现组件动画效果的高效方式&#xff0c;主要通过 CSS transitions 和 keyframes 动画 CSS Keyframes&#xff08;关键帧动画&#xff09; 用来创建复杂的动画序列&#xff0c;可以精确控制动画的各个阶段。 核心语法&#xff1a; keyframes animationNa…

小型园区网实验

划分VLAN SW3 [sw3]vlan batch 2 3 20 30 [sw3]interface GigabitEthernet 0/0/1 [sw3-GigabitEthernet0/0/1]port link-type access [sw3-GigabitEthernet0/0/1]port default vlan 2 [sw3-GigabitEthernet0/0/1]int g0/0/2 [sw3-GigabitEthernet0/0/2]port link-type acces…

使用LangChain Agents构建Gradio及Gradio Tools(6)——创建自己的GradioTool

使用LangChain Agents构建Gradio及Gradio Tools(6)——创建自己的GradioTool 本篇摘要16. 使用LangChain Agents构建Gradio及Gradio Tool16.6 创建自己的GradioTool16.6.1 创建步骤16.6.2 创建示例StableDiffusionTool参考文献本章目录如下: 《使用LangChain Agents构建Grad…

SDL显示YUV视频

文章目录 1. **宏定义和初始化**2. **全局变量**3. **refresh_video_timer 函数**4. **WinMain 函数**主要功能及工作流程&#xff1a;总结&#xff1a; 1. 宏定义和初始化 #define REFRESH_EVENT (SDL_USEREVENT 1) // 请求画面刷新事件 #define QUIT_EVENT (SDL…

AnimateCC基础教学:随机抽取花名册,不能重复

一.核心代码: this.btnStartObj.addEventListener("click", switchBtn); this.btnOkObj.addEventListener("click", oKBtn); createjs.Ticker.addEventListener("tick", updateRandom); var _this this; var nameArr ["张三", &quo…

软考 系统架构设计师系列知识点 —— 设计模式之抽象工厂模式

本文内容参考&#xff1a; 软考 系统架构设计师系列知识点之设计模式&#xff08;2&#xff09;_系统架构设计师中考设计模式吗-CSDN博客 https://baike.baidu.com/item/%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F/2361182 特此致谢&#xff01; Abstract Fac…

P2040 打开所有的灯

题目背景 pmshz在玩一个益(ruo)智(zhi)的小游戏&#xff0c;目的是打开九盏灯所有的灯&#xff0c;这样的游戏难倒了pmshz。。。 题目描述 这个灯很奇(fan)怪(ren)&#xff0c;点一下就会将这个灯和其周围四盏灯的开关状态全部改变。现在你的任务就是就是告诉pmshz要全部打开…

汉得企业级 PaaS 平台 H-ZERO 1.12.0 发布!四大维度升级,构建企业数字化新底座

汉得企业级 PaaS 平台&#xff08;以下简称"H-ZERO"&#xff09;是一款基于微服务架构的企业级数字化 PaaS 平台&#xff0c;可支持企业各类系统搭建、产品研发&#xff0c;帮助企业快速构架技术中台。 H-ZERO于2025年3月底正式发布 V1.12.0 &#xff0c;此次发布聚…

ReplicaSet、Deployment功能是怎么实现的?

在Kubernetes中&#xff0c;ReplicaSet 和 Deployment 是用于管理 Pod 副本的关键对象。它们各自的功能和实现机制如下&#xff1a; 1. ReplicaSet 功能 管理 Pod 副本&#xff1a;确保指定数量的 Pod 副本一直在运行。如果有 Pod 副本崩溃或被删除&#xff0c;ReplicaSet 会…

物联网外设管理服务平台

1 开发目标 1.1 架构图 操作系统&#xff1a;基于Linux5.10.10源码和STM32MP157开发板&#xff0c;完成tf-a(FSBL)、u-boot(SSBL)、uImage、dtbs的裁剪&#xff1b; 驱动层&#xff1a;为每个外设配置DTS并且单独封装外设驱动模块。其中电压ADC测试&#xff0c;采用linux内核…

PyTorch教程:如何读写张量与模型参数

本文演示了PyTorch中张量&#xff08;Tensor&#xff09;和模型参数的保存与加载方法&#xff0c;并提供完整的代码示例及输出结果&#xff0c;帮助读者快速掌握数据持久化的核心操作。 1. 保存和加载单个张量 通过torch.save和torch.load可以直接保存和读取张量。 import to…

持续集成:GitLab CI/CD 与 Jenkins CI/CD 的全面剖析

一、引言 在当今快速迭代的软件开发领域,持续集成(Continuous Integration,CI)已成为保障软件质量、加速开发流程的关键实践。通过频繁地将代码集成到共享仓库,并自动进行构建和测试,持续集成能够尽早发现并解决代码冲突和缺陷。而 GitLab CI/CD 和 Jenkins CI/CD 作为两…

Python 序列构成的数组(序列的增量赋值)

序列的增量赋值 增量赋值运算符 和 * 的表现取决于它们的第一个操作对象。简单起 见&#xff0c;我们把讨论集中在增量加法&#xff08;&#xff09;上&#xff0c;但是这些概念对 * 和其他 增量运算符来说都是一样的。 背后的特殊方法是 iadd &#xff08;用于“就地加法”&…

GEO, TCGA 等将被禁用?!这40个公开数据库可能要小心使用了

GEO, TCGA 等将被禁用&#xff1f;&#xff01;这40个公开数据库可能要小心使用了 最近NIH公共数据库开始对中国禁用的消息闹得风风火火&#xff1a; 你认为研究者上传到 GEO 数据库上的数据会被禁用吗&#xff1f; 单选 会&#xff0c;毕竟占用存储资源 不会&#xff0c;不…

【如何自建MCP服务器?从协议原理到实践的全流程指南】

文章目录 如何自建MCP服务器&#xff1f;从协议原理到实践的全流程指南一、MCP协议是什么&#xff1f;核心架构 二、为什么要自建MCP服务器&#xff1f;1. 突破LLM的固有局限2. 实现个性化功能扩展3. 确保数据隐私安全 三、手把手搭建MCP服务器&#xff08;Python示例&#xff…

鸿蒙开发_ARKTS快速入门_语法说明_渲染控制---纯血鸿蒙HarmonyOS5.0工作笔记012

然后我们再来看渲染控制 首先看条件渲染,其实就是根据不同的状态,渲染不同的UI界面 比如下面这个暂停 开启播放的 可以看到就是通过if 这种条件语句 修改状态变量的值 然后我们再来看这个, 下面点击哪个,上面横线就让让他显示哪个 去看一下代码 可以看到,有两个状态变量opt…

【Java设计模式】第3章 软件设计七大原则

3-1 本章导航 学习开辟原则(基础原则)依赖倒置原则单一职责原则接口隔离原则迪米特法则(最少知道原则)里氏替换原则合成复用原则(组合复用原则)核心思想: 设计原则需结合实际场景平衡,避免过度设计。设计模式中可能部分遵循原则,需灵活取舍。3-2 开闭原则讲解 定义 软…

JVM即时编译(JIT)

JVM基础回顾 Java 作为一门高级程序语言&#xff0c;由于它自身的语言特性&#xff0c;它并非直接在硬件上运行&#xff0c;而是通过编译器(前端编译器)将 Java 程序转换成该虚拟机所能识别的指令序列&#xff0c;也就是字节码&#xff0c;然后运行在虚拟机之上的&#xff1b;…

刚体碰撞检测与响应(C++实现)

本文实现一个经典的物理算法&#xff1a;刚体碰撞检测与响应。这个算法用于检测两个刚体&#xff08;如矩形或圆形&#xff09;是否发生碰撞&#xff0c;并在碰撞时更新它们的速度和位置。我们将使用C来实现这个算法&#xff0c;并结合**边界框&#xff08;Bounding Box&#x…