学习数据结构的心得

张开发
2026/4/13 1:35:09 15 分钟阅读

分享文章

学习数据结构的心得
大一计科数据结构学习心得从背概念懵圈到能自己写栈实现大家好我是大一计科的学生这学期刚接触数据结构这门课。最开始我天真地以为这就是一门“背定义”的课——把栈、队列、链表的概念背熟就能应付考试了。直到第一次上机写C语言实现栈的作业我对着编译器报错看了半小时才明白数据结构的学习从来都不是纸上谈兵。一、入门踩坑死记硬背只会抄代码刚上数据结构课的时候老师讲栈的“先进后出”、队列的“先进先出”我觉得这也太简单了背下来不就完了结果第一次上机作业要求用C语言写一个顺序栈我直接傻眼了- 栈顶指针 top 到底该怎么定义初始值是0还是-1- 数组实现的栈怎么判断栈满和栈空- 入栈操作时怎么避免数组越界我照着教材上的代码抄了一遍跑起来确实能出结果但让我自己改个栈的大小程序直接崩了。那时候我才发现我根本没懂代码背后的逻辑只是在机械地“抄作业”而已。二、找到节奏画图拆解把抽象变具体后来我才意识到我搞不懂的根本原因是没把抽象的概念变成“看得见的结构”。之前看文字说“栈顶指针指向栈顶元素的下一个位置”我完全没概念直到自己在草稿纸上画了一张顺序栈的示意图画完图我瞬间懂了原来入栈就是把元素放到 arr[top] 的位置然后 top 出栈就是 top-- 再取 arr[top] 的值。从那之后不管学什么结构我都先画图拆解- 学单链表时画清楚每个节点的 next 指针指向搞懂带头节点和不带头节点的区别- 学队列时用画图理解 front 和 rear 指针的移动搞懂循环队列怎么解决“假溢出”问题。原来画图才是理解数据结构的神器尤其是链表这种指针绕来绕去的结构画个图逻辑瞬间就清晰了。三、动手实现从抄代码到“从零写”搞懂逻辑之后我开始试着自己从零写代码而不是直接抄书。就拿顺序栈来说我把整个实现拆成了几个小部分写完一个就测试一个避免bug堆在一起1. 定义栈的结构体2. 初始化栈3. 判空、判满函数4. 入栈、出栈操作5. 取栈顶元素6. 销毁栈释放内存给大家放一下我踩坑后写的带注释版顺序栈实现也是我真正搞懂栈逻辑的“里程碑”代码c#include stdio.h#include stdlib.h#define MAXSIZE 10 // 定义栈的最大容量// 定义顺序栈结构体typedef struct {int data[MAXSIZE]; // 用数组存储栈元素int top; // 栈顶指针初始为0指向栈顶元素的下一个位置} SeqStack;// 初始化栈void InitStack(SeqStack *s) {s-top 0; // 初始栈空top0}// 判断栈是否为空int IsEmpty(SeqStack *s) {return s-top 0;}// 判断栈是否已满int IsFull(SeqStack *s) {return s-top MAXSIZE;}// 入栈操作成功返回1失败返回0int Push(SeqStack *s, int val) {if (IsFull(s)) {printf(栈已满无法入栈\n);return 0;}s-data[s-top] val; // 元素放到top指向的位置s-top; // top后移一位return 1;}// 出栈操作成功返回1失败返回0val用于接收出栈元素int Pop(SeqStack *s, int *val) {if (IsEmpty(s)) {printf(栈为空无法出栈\n);return 0;}s-top--; // top先前移一位指向栈顶元素*val s-data[s-top]; // 取出栈顶元素return 1;}// 取栈顶元素不删除int GetTop(SeqStack *s, int *val) {if (IsEmpty(s)) {printf(栈为空无栈顶元素\n);return 0;}*val s-data[s-top - 1]; // top-1才是栈顶元素的位置return 1;}// 测试主函数int main() {SeqStack s;InitStack(s);int val;// 测试入栈printf(入栈1、2、3\n);Push(s, 1);Push(s, 2);Push(s, 3);GetTop(s, val);printf(当前栈顶元素%d\n, val); // 输出3// 测试出栈printf(\n出栈操作\n);Pop(s, val);printf(出栈元素%d\n, val); // 输出3Pop(s, val);printf(出栈元素%d\n, val); // 输出2GetTop(s, val);printf(当前栈顶元素%d\n, val); // 输出1return 0;}写完这段代码我才真正搞懂了 top 指针的意义——原来它的初始值、入栈出栈的顺序都和栈的定义强相关。之前抄代码时我根本没注意到 GetTop 函数里要取 top-1 的位置现在自己写一遍再也不会搞错了。四、学习过程中我踩过的那些坑这里整理几个我写代码时踩过的雷希望大家别像我一样踩坑1. 栈顶指针初始值搞混一开始我把 top 初始值设成了1结果第一个入栈的元素直接放到了 arr[1] arr[0] 一直空着出栈逻辑全乱了。后来才明白初始值要和入栈逻辑对应不能随便写。2. 链表忘记处理头节点写单链表时一开始没带头节点结果插入第一个节点和后续节点的逻辑不一样bug堆了一堆。加了头节点之后所有节点的插入逻辑都统一了瞬间清爽了。3. 忘记释放内存导致内存泄漏写动态链表时节点都是用 malloc 申请的一开始没写销毁函数后来老师提醒才知道不释放内存会导致内存泄漏补上 free 才安心。4. 不测试边界情况一开始写栈的时候从来没试过空栈出栈、栈满入栈结果一跑边界情况直接崩了。后来每次写完代码我都会特意测一遍这些极端情况代码健壮性好了很多。五、给大一同学习数据结构的小建议1. 别光背概念一定要画图写代码数据结构的概念很抽象画个图、写段代码跑一遍比背十遍定义都管用。2. 从简单到难循序渐进先学栈、队列这种线性结构再学链表再接触树、图别一开始就啃难的很容易劝退。3. 写代码先拆解再实现比如写一个结构先拆成初始化、增删改查、销毁几个部分一个一个写写完就测试别一口气全写完再调试。4. 学会用调试工具找bugVS或者DevC的调试功能能一步步看变量和指针的值很多问题一看就懂了别对着报错瞎改。5. 把学习过程记录下来像我这样写CSDN博客把心得、代码、踩的坑都记下来既是复习以后再回头看也能想起当时的思路。最后数据结构不是终点而是起点以前总觉得数据结构是为了应付考试现在才明白它是教我们怎么用更高效的方式组织和处理数据。比如栈的先进后出原来可以用来解决括号匹配、表达式求值的问题队列的先进先出是很多调度算法的基础。接下来我还要继续学树和图也会把自己的学习过程、代码实现都记录在CSDN上既是给自己留个学习记录也希望能帮到和我一样刚入门的同学。标签 #数据结构 #C语言 #大一学习心得 #编程入门

更多文章