数据结构面试题报错调试方法记录

栈和队列报错调试

1.用栈实现队列

232. 用栈实现队列 - 力扣(LeetCode)

此题解题思路如下:

先将数据放在pushst栈里面,popst栈为空再把pushst栈里面的数据放进popst栈里面去,不为空则不执行。不为空时候直接拿取栈顶数据。

GIF 2024-4-2 19-14-14

代码如下:

typedef int STDataType;typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;void STInit(ST* pst);
void STDestroy(ST* pst);void STPush(ST* pst, STDataType x);
void STPop(ST* pst);
STDataType STTop(ST* pst);//拿取栈顶数据bool STEmpty(ST* pst);
int STSize(ST* pst);void STInit(ST* pst)
{assert(pst);pst->a = NULL;pst->capacity = 0;//表示top指向栈顶元素的下一个位置pst->top = 0;
}void STDestroy(ST* pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->capacity = pst->top = 0;
}void STPush(ST* pst, STDataType x)
{assert(pst);if (pst->top == pst->capacity){int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * newcapacity);if (tmp == NULL){perror("realloc fail");return;}pst->a = tmp;pst->capacity = newcapacity;}pst->a[pst->top] = x;pst->top++;
}void STPop(ST* pst)
{assert(pst);assert(pst->top >0);pst->top--;
}STDataType STTop(ST* pst)
{assert(pst);assert(pst->top > 0);return pst->a[pst->top-1];
}bool STEmpty(ST* pst)//判断真假
{assert(pst);return pst->top == 0;
}int STSize(ST* pst)
{assert(pst);return pst->top;
}typedef struct 
{ST pushst;ST popst;
} MyQueue;MyQueue* myQueueCreate() 
{MyQueue* obj=(MyQueue*)malloc(sizeof(MyQueue));STInit(&obj->pushst);STInit(&obj->popst);return obj;
}void myQueuePush(MyQueue* obj, int x) 
{STPush(&obj->pushst, x);
}int myQueuePop(MyQueue* obj) 
{int tmp=myQueuePeek(&obj->popst);STPop(&obj->popst);return tmp;
}int myQueuePeek(MyQueue* obj) 
{if(STEmpty(&obj->popst)){while(!STEmpty(&obj->pushst)){STPush(&obj->popst, STTop(&obj->pushst));STPop(&obj->pushst);}}return STTop(&obj->popst);
}bool myQueueEmpty(MyQueue* obj) 
{return STEmpty(&obj->pushst)&&STEmpty(&obj->popst);
}void myQueueFree(MyQueue* obj) 
{STDestroy(&obj->popst);STDestroy(&obj->pushst);free(obj);obj =NULL;
}/*** Your MyQueue struct will be instantiated and called as such:* MyQueue* obj = myQueueCreate();* myQueuePush(obj, x);* int param_2 = myQueuePop(obj);* int param_3 = myQueuePeek(obj);* bool param_4 = myQueueEmpty(obj);* myQueueFree(obj);
*/

报错1如下:

image-20240402095239891

错误原因分析:

编译出错是运行问题,执行出错是代码逻辑问题,没有报结果大概率是头部出错。以此为基础推导出错原因,思路如下:

将上面代码拷贝至VS调试按照力扣所提供的测试样例进行传参,这道题我是使用栈实现代码进行解题,所以直接使用之前的实现代码进行调试,如果不知道栈的实现方法请观看这篇文章:

我们观察力扣所提供的测试样例:

image-20240402100810433

我们先看力扣对这几个函数的传参设置:

image-20240402101850053

函数"MyQueue"无传参值设置只需要一个返回值接受它,所以无需传参。调用两次"push"函数传结构体指针然后分别给x传1,2。剩下的"peek",“pop”,"empty"只需要传结构体指针。

但一般调试无需调用这么多函数,我调用了两个函数进行调试,调用如下:

int main()
{MyQueue* obj = myQueueCreate();myQueuePush(&obj, 1);return 0;
}

运行时候realloc函数会报错,出现内存不足的问题:

image-20240402103447110

首先排除栈实现代码问题,因为实现时候调试过,没有报错,我们将问题范围缩小在实现队列部分,而初始化问题我前面已经解决了,那么排除初始化问题。因为是开辟空间报错,我们监视栈的结构体值变化,如图所示发现运行STPush函数的时候,栈的结构体里面的指针会变成野指针:

image-20240402160928254

我们查看所有调用STPush的函数:

image-20240402160138241

按思路走读一下代码,发现myQueuePop函数调用myQueuePeek函数时候我们想传的是出栈函数的地址给myQueuePeek函数进行调用,myQueuePeek函数调用STPush的函数我们想传的是出栈函数的地址给STPush函数进行调用,我们将此代码的思路图画出来,发现obj访问pushst结构体后再访问里面的pushst结构体,所以是传参错误,因为myQueuePeek函数里面已经传pushst的地址给STPush函数了,所以myQueuePop函数调用myQueuePeek函数只需要传obj指针调用即可。

image-20240402163030998

报错2如下:

image-20240402193810781

实现代码如下:

typedef struct 
{ST* pushst;ST* popst;
} MyQueue;MyQueue* myQueueCreate() 
{MyQueue* obj=(MyQueue*)malloc(sizeof(MyQueue));STInit(&obj->pushst);STInit(&obj->popst);return obj;
}void myQueuePush(MyQueue* obj, int x) 
{STPush(&obj->pushst, x);
}int myQueuePop(MyQueue* obj) 
{int tmp=myQueuePeek(obj);STPop(&obj->popst);return tmp;
}int myQueuePeek(MyQueue* obj) 
{if(STEmpty(&obj->popst)){while(!STEmpty(&obj->pushst)){STPush(&obj->popst, STTop(&obj->pushst));STPop(&obj->pushst);}}return STTop(&obj->popst);
}bool myQueueEmpty(MyQueue* obj) 
{return STEmpty(&obj->pushst)&&STEmpty(&obj->popst);
}void myQueueFree(MyQueue* obj) 
{STDestroy(&obj->popst);STDestroy(&obj->pushst);free(obj);obj =NULL;
}

我们观察这段代码:

image-20240402194929377

malloc函数开辟出来的指针只为MyQueue结构体开辟空间。但是MyQueue结构体里存放了两个结构体指针,不初始化就为空指针,初始化了为空指针,在栈实现的代码中assert(pst)会报错。不初始化会出现野指针访问报错,如果要写两个指针,需要再为这两个指针开辟空间。
STDestroy(&obj->popst);
STDestroy(&obj->pushst);

free(obj);
obj =NULL;

}


我们观察这段代码:[外链图片转存中...(img-RbuGxtYJ-1712389444934)]malloc函数开辟出来的指针只为MyQueue结构体开辟空间。但是MyQueue结构体里存放了两个结构体指针,不初始化就为空指针,初始化了为空指针,在栈实现的代码中assert(pst)会报错。不初始化会出现野指针访问报错,如果要写两个指针,需要再为这两个指针开辟空间。

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

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

相关文章

【技术笔记】Ubuntu下VirtualBox不能识别USB解决办法(手把手解决)

环境说明 系统版本:Ubuntu 20.04 VirtualBox版本: 7.0.12 解决过程 扩展下载,进入VirtualBox 官方下载路径。选择本机安装版本,如下图所示,因笔者是7.0.x版本,因此点击第一条链接; 进入版本页…

机器学习(30)

文章目录 摘要一、文献阅读1. 题目2. abstract3. 网络架构3.1 Sequence Generative Adversarial Nets3.2 SeqGAN via Policy Gradient3.3 The Generative Model for Sequences3.4 The Discriminative Model for Sequences(CNN) 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过…

【Vue3源码学习】— CH2.7 Computed: Vue 3 计算属性深入解析

Computed: Vue 3 计算属性深入解析 1.计算属性的基本用法2. ComputedRefImpl 类深入解析JavaScript 中的 getter 函数 3. 计算属性的创建:computed 方法解析3.1 源码解析3.2 使用示例 4. 计算属性的工作原理5. 手动实现简化的计算属性6. 结语 在 Vue 3 的响应式系统…

【教程】VOC数据集制作

语义分割任务中VOC数据集的制作,任务中只有一种标签:gas 文章目录 1、由黑白图像识别为txt标签2、txt转json3、数据集转VOC格式 1、由黑白图像识别为txt标签 由于使用CycleGAN网络进行风格迁移学习,生成了大量伪标签图像,因此需…

【递归与递推】数的计算|数的划分|耐摔指数

1.数的计算 - 蓝桥云课 (lanqiao.cn) 思路: 1.dfs的变量>每一次递归什么在变? (1)当前数的大小一直在变:sum (2)最高位的数:k 2.递归出口:最高位数字为1 3.注意&#…

鱼塘钓鱼(c++实现)

题目 有 N 个鱼塘排成一排,每个鱼塘中有一定数量的鱼,例如:N5 时,如下表: 即:在第 1 个鱼塘中钓鱼第 1 分钟内可钓到 10 条鱼,第 2 分钟内只能钓到 8 条鱼,……,第 5 分…

Codeforces Round 932 (Div. 2) ---- F. Andrey‘s Tree ---- 题解

F. Andreys Tree: 题目描述: 思路解析: 我们假设删除任意一个结点后,我们会将整个树切分为k个联通块,那么可以明确的知道我们只需要连接(k-1)条边就可以将这k个联通块重新连为一棵树。 那么最小代价是啥呢? 图解分…

【网站项目】校园订餐小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

鱼骨图功能实现

dom: <div class="module-content"><div class="title"><span>[</span><p>鱼骨图</p><span>]</span></div><div class="line-mian"></div><div :ref="module + i&q…

2024-04-07 作业

作业要求&#xff1a; 1> 思维导图 2> 自由发挥应用场景实现一个登录窗口界面。 【可以是QQ登录界面、也可以是自己发挥的登录界面】 要求&#xff1a;尽量每行代码都有注释 作业1&#xff1a; 作业2&#xff1a; 运行代码&#xff1a; #include "myqwidget.h&quo…

hatch,现代化的 Python 项目管理和打包工具!

目录 前言 安装 特性 基本功能 项目创建 示例代码 虚拟环境管理 依赖管理 测试 打包和发布 高级功能 插件系统 配置环境管理 自定义构建选项 集成测试工具 实际应用场景 多环境管理 持续集成与持续部署&#xff08;CI/CD&#xff09; 项目原型化 依赖与包管理 总结 前言…

Q1剧集市场复盘:2024爱优腾谁在领跑国产剧市场?

2024年Q1剧集市场的成绩单出炉了。 复盘2024年第一季度剧集市场&#xff0c;可以用“生机勃勃”四个字来形容&#xff0c;虽然和去年相比&#xff0c;今年的第一季度缺少了《狂飙》这样的头部大爆款&#xff0c;但市场大盘走势向好。 根据灯塔专业版统计&#xff0c;2024Q1剧…

nginx配置实例-反向代理

目录 一、目标-反向代理实现效果 二、安装tomcat 三、配置nginx服务 四、配置反向代理 一、目标-反向代理实现效果 访问过程分析&#xff1a; 二、安装tomcat 1、安装jdk环境 新建/export/server目录 解压jdk 查看是否解压成功 配置jdk软连接 进入jdk的bin目录中&#x…

echart 折线图或散点图当横坐标为小数位时,若想显示整数该如何处理?

如图当前是这样的&#xff1a; 横坐标刻度目前是小数位&#xff0c;如果直接将小数位取整则会失去精度&#xff0c;所以我们要做的是刻度即是整数&#xff0c;又能显示小数位对应的数值&#xff1b; 思路就是直接手动设置刻度&#xff1a;设置xAxis的min,max,splitNumber,同时不…

蓝桥杯-冶炼金属(二分求最大最小)

P9240 [蓝桥杯 2023 省 B] 冶炼金属 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 二分做法&#xff1a; #include<bits/stdc.h> using namespace std; #define int long long const int N 1e410; int n,a,b; int v[N],cnt[N]; int check(int x){for(int i1;i<n;i…

火山方舟大模型服务平台调用Demo测试(豆包)

豆包得后台大模型支持为字节得火山方舟&#xff0c;所以想使用豆包的API&#xff0c;直接从这里就可以。 一、首先注册账号&#xff1a; 火山引擎-云上增长新动力 注册完成之后&#xff0c;控制台-账户-API访问密钥 二、找到API测试用例&#xff1a; Skylark-chat API调用…

数组排序(Comparator)

题目 import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();sc.nextLine();Integer[] res new Integer[n1];//使用Integ…

让智能体像孩子一样观察别人学习动作,跨视角技能学习数据集EgoExoLearn来了

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 在探索人工智能边界时&#xff0c;我们时常惊叹于人类孩童的学习能力 —— 可以轻易地将他人…

OLAP 和 OLTP

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 OLTP与OLAP的介绍OLTP&#xff08;on-line transaction processing&#xff09;&#xff1a;联机事务处理OLAP&#xff08;On-Line Analytical Processing&#xff…

SOLIDWORKS在教育领域的应用

随着科技的飞速发展和数字化浪潮的推进&#xff0c;SOLIDWORKS作为一款强大的三维设计软件&#xff0c;其应用领域已经不仅局限于工程设计和制造行业&#xff0c;还逐渐渗透到教育领域中&#xff0c;成为培养学生实践能力和创新思维的重要工具。本文将探讨SOLIDWORKS在教育领域…