数据结构实验总结报告
数据结构实验报告_实验报告_

数据结构实验报告想必学计算机专业的同学都知道数据结构是一门比较重要的课程,那么,下面是小编给大家整理收集的数据结构实验报告,供大家阅读参考。
数据结构实验报告1一、实验目的及要求1)掌握栈和队列这两种特殊的线性表,熟悉它们的特性,在实际问题背景下灵活运用它们。
本实验训练的要点是“栈”和“队列”的观点;二、实验内容1) 利用栈,实现数制转换。
2) 利用栈,实现任一个表达式中的语法检查(选做)。
3) 编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列);三、实验流程、操作步骤或核心代码、算法片段顺序栈:Status InitStack(SqStack &S){S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemTyp e));if(!S.base)return ERROR;S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;}Status DestoryStack(SqStack &S){free(S.base);return OK;}Status ClearStack(SqStack &S){S.top=S.base;return OK;}Status StackEmpty(SqStack S){if(S.base==S.top)return OK;return ERROR;}int StackLength(SqStack S){return S.top-S.base;}Status GetTop(SqStack S,ElemType &e){if(S.top-S.base>=S.stacksize){S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemTyp e));if(!S.base) return ERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;Status Push(SqStack &S,ElemType e){if(S.top-S.base>=S.stacksize){S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemTyp e));if(!S.base)return ERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;}Status Pop(SqStack &S,ElemType &e){if(S.top==S.base)return ERROR;e=*--S.top;return OK;}Status StackTraverse(SqStack S){ElemType *p;p=(ElemType *)malloc(sizeof(ElemType));if(!p) return ERROR;p=S.top;while(p!=S.base)//S.top上面一个...p--;printf("%d ",*p);}return OK;}Status Compare(SqStack &S){int flag,TURE=OK,FALSE=ERROR; ElemType e,x;InitStack(S);flag=OK;printf("请输入要进栈或出栈的元素:"); while((x= getchar)!='#'&&flag) {switch (x){case '(':case '[':case '{':if(Push(S,x)==OK)printf("括号匹配成功!\n\n"); break;case ')':if(Pop(S,e)==ERROR || e!='('){printf("没有满足条件\n");flag=FALSE;}break;case ']':if ( Pop(S,e)==ERROR || e!='[')flag=FALSE;break;case '}':if ( Pop(S,e)==ERROR || e!='{')flag=FALSE;break;}}if (flag && x=='#' && StackEmpty(S)) return OK;elsereturn ERROR;}链队列:Status InitQueue(LinkQueue &Q) {Q.front =Q.rear=(QueuePtr)malloc(sizeof(QNode));if (!Q.front) return ERROR;Q.front->next = NULL;return OK;}Status DestoryQueue(LinkQueue &Q) {while(Q.front){Q.rear=Q.front->next;free(Q.front);Q.front=Q.rear;}return OK;}Status QueueEmpty(LinkQueue &Q){if(Q.front->next==NULL)return OK;return ERROR;}Status QueueLength(LinkQueue Q){int i=0;QueuePtr p,q;p=Q.front;while(p->next){i++;p=Q.front;q=p->next;p=q;}return i;}Status GetHead(LinkQueue Q,ElemType &e) {QueuePtr p;p=Q.front->next;if(!p)return ERROR;e=p->data;return e;}Status ClearQueue(LinkQueue &Q){QueuePtr p;while(Q.front->next ){p=Q.front->next;free(Q.front);Q.front=p;}Q.front->next=NULL;Q.rear->next=NULL;return OK;}Status EnQueue(LinkQueue &Q,ElemType e) {QueuePtr p;p=(QueuePtr)malloc(sizeof (QNode));if(!p)return ERROR;p->data=e;p->next=NULL;Q.rear->next = p;Q.rear=p; //p->next 为空return OK;}Status DeQueue(LinkQueue &Q,ElemType &e) {QueuePtr p;if (Q.front == Q.rear)return ERROR;p = Q.front->next;e = p->data;Q.front->next = p->next;if (Q.rear == p)Q.rear = Q.front; //只有一个元素时(不存在指向尾指针) free (p);return OK;}Status QueueTraverse(LinkQueue Q){QueuePtr p,q;if( QueueEmpty(Q)==OK){printf("这是一个空队列!\n");return ERROR;}p=Q.front->next;while(p){q=p;printf("%d<-\n",q->data);q=p->next;p=q;}return OK;}循环队列:Status InitQueue(SqQueue &Q){Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType)); if(!Q.base)exit(OWERFLOW);Q.front=Q.rear=0;return OK;}Status EnQueue(SqQueue &Q,QElemType e){if((Q.rear+1)%MAXQSIZE==Q.front)return ERROR;Q.base[Q.rear]=e;Q.rear=(Q.rear+1)%MAXQSIZE;return OK;}Status DeQueue(SqQueue &Q,QElemType &e){if(Q.front==Q.rear)return ERROR;e=Q.base[Q.front];Q.front=(Q.front+1)%MAXQSIZE;return OK;}int QueueLength(SqQueue Q){return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;}Status DestoryQueue(SqQueue &Q){free(Q.base);return OK;}Status QueueEmpty(SqQueue Q) //判空{if(Q.front ==Q.rear)return OK;return ERROR;}Status QueueTraverse(SqQueue Q){if(Q.front==Q.rear)printf("这是一个空队列!");while(Q.front%MAXQSIZE!=Q.rear){printf("%d<- ",Q.base[Q.front]);Q.front++;}return OK;}数据结构实验报告2一.实验内容:实现哈夫曼编码的生成算法。
数据结构实验报告实验总结

数据结构实验报告实验总结本次数据结构实验主要涉及线性表、栈和队列的基本操作以及链表的应用。
通过实验,我对这些数据结构的特点、操作和应用有了更深入的了解。
下面对每一部分实验进行总结。
实验一:线性表的基本操作线性表是一种常见的数据结构,本实验要求实现线性表的基本操作,包括插入、删除、查找、遍历等。
在实验过程中,我对线性表的结构和实现方式有了更清晰的认识,掌握了用数组和链表两种方式实现线性表的方法。
实验二:栈的应用栈是一种后进先出(LIFO)的数据结构,本实验要求利用栈实现简单的括号匹配和后缀表达式计算。
通过实验,我了解到栈可以方便地实现对于括号的匹配和后缀表达式的计算,有效地解决了对应的问题。
实验三:队列的应用队列是一种先进先出(FIFO)的数据结构,本实验要求利用队列实现银行排队和迷宫求解。
通过实验,我对队列的应用有了更加深入的了解,了解到队列可以解决需要按顺序处理的问题,如排队和迷宫求解等。
实验四:链表的应用链表是一种常用的数据结构,本实验要求利用链表实现学生信息管理系统。
通过实验,我对链表的应用有了更深入的了解,了解到链表可以方便地实现对于数据的插入、删除和修改等操作,并且可以动态地调整链表的长度,适应不同的需求。
通过本次实验,我掌握了线性表、栈、队列和链表的基本操作,并了解了它们的特点和应用方式。
同时,通过实际编程的过程,我对于数据结构的实现方式和效果有了更直观的认识,也锻炼了自己的编程能力和解决问题的能力。
在实验过程中,我遇到了一些问题,如程序逻辑错误和内存泄漏等,但通过调试和修改,最终成功解决了这些问题,对自己的能力也有了更多的信心。
通过本次实验,我深刻体会到了理论与实践的结合的重要性,也对于数据结构这门课程有了更加深入的理解。
总之,本次数据结构实验给予了我很多有益的启发和收获,对于数据结构的概念、特点和应用有了更深入的理解。
在以后的学习中,我会继续加强对数据结构的学习和研究,不断提高自己的编程能力和解决问题的能力。
数据结构实验报告总结

数据结构实验报告总结本次数据结构实验主要涉及到线性表、栈和队列的基本操作,通过实验操作和总结,我对数据结构的相关知识有了更深入的理解和掌握。
首先,我们进行了线性表的实验操作。
线性表是一种数据结构,它是由n(n≥0)个数据元素组成的有限序列。
在实验中,我们学习了线性表的顺序存储结构和链式存储结构。
通过代码实现,我深刻理解了顺序表和链表的存储方式和特点。
在实验过程中,我发现顺序表适合查找操作,而链表适合插入和删除操作。
这让我对线性表的应用场景有了更清晰的认识。
其次,我们进行了栈的实验操作。
栈是一种特殊的线性表,它只能在表的一端进行插入和删除操作。
在实验中,我学习了栈的基本操作,包括入栈和出栈。
通过实际操作,我深刻理解了栈的“先进后出”的特性,以及它在计算机程序设计中的应用。
我发现栈在递归算法、表达式求值和括号匹配等方面有着重要的作用,这让我对栈的实际应用有了更深入的认识。
最后,我们进行了队列的实验操作。
队列是一种特殊的线性表,它只能在表的一端进行插入操作,而在另一端进行删除操作。
在实验中,我学习了队列的基本操作,包括入队和出队。
通过实际操作,我深刻理解了队列的“先进先出”的特性,以及它在计算机程序设计中的重要性。
我发现队列在广度优先搜索、模拟系统等方面有着重要的应用,这让我对队列的实际应用有了更深入的了解。
通过本次数据结构实验,我不仅掌握了线性表、栈和队列的基本操作,还深刻理解了它们在实际应用中的重要性。
我相信这些知识和经验对我的学习和工作都将有着重要的帮助。
在未来的学习和实践中,我将继续加强对数据结构的理解和运用,不断提升自己的编程能力和解决问题的能力。
总之,本次数据结构实验让我受益匪浅,我将继续努力学习和实践,不断提升自己的专业能力。
希望通过不懈的努力,能够在数据结构领域取得更大的成就。
数据结构实验总结及心得体会

数据结构实验总结及心得体会引言数据结构作为计算机科学的基础课程,是理解和应用计算机编程的重要部分。
通过实验的形式,我们可以更加深入地理解不同数据结构的特点和应用场景。
本文将总结我在数据结构实验中的学习经验和心得体会。
实验一:线性表在线性表实验中,我学习了顺序表和链表两种基本的线性表结构。
顺序表使用数组来存储数据,具有随机访问的特点;链表使用指针来连接数据元素,具有插入和删除操作方便的特点。
通过这个实验,我深刻认识了线性表的存储结构和操作方法。
我遇到的难点是链表的插入和删除操作,因为涉及到指针的重新指向。
通过调试和分析代码,我逐渐理解了指针指向的含义和变化规律。
在实验结束后,我还进一步学习了循环链表和双向链表的特点和应用。
实验二:栈和队列栈和队列是两种常用的数据结构,可以用来解决很多实际问题。
在这个实验中,我学习了顺序栈、链式栈、顺序队列和链式队列四种基本实现方式。
实验中我遇到的最大困难是队列的循环队列实现,因为需要处理队列尾指针的位置变化。
我通过画图和调试发现了队列尾指针的变化规律,并在实验中成功实现了循环队列。
熟练掌握了栈和队列的操作方法后,我进一步学习了栈的应用场景,如表达式求值和括号匹配等。
队列的应用场景还有优先级队列和循环队列等。
实验三:串串是由零个或多个字符组成的有限序列,是实际应用中十分常见的数据类型。
在这个实验中,我学习了串的存储结构和常规操作。
实验中最具挑战性的部分是串的模式匹配。
模式匹配是在一个主串中查找一个子串的过程,可以使用暴力匹配、KMP 算法和BM算法等不同的匹配算法。
在实验中,我实现了KMP算法,并在实际应用中进行了测试。
从实验中我学到了使用前缀表和后缀表来提高模式匹配的效率。
同时,在应用中也了解到了串的搜索和替换等常见操作。
实验四:树和二叉树树是一种重要的非线性数据结构,应用广泛。
在这个实验中,我学习了树的基本概念、存储结构和遍历方式。
实验中最困难的部分是二叉树的遍历。
数据结构实验报告2篇

数据结构实验报告数据结构实验报告精选2篇(一)实验目的:1. 熟悉数据结构的基本概念和基本操作;2. 掌握线性表、栈、队列、链表等经典数据结构的实现方法;3. 掌握数据结构在实际问题中的应用。
实验内容:本次实验主要包括以下几个部分:1. 线性表的实现方法,包括顺序表和链表,分别使用数组和链表来实现线性表的基本操作;2. 栈的实现方法,包括顺序栈和链式栈,分别使用数组和链表来实现栈的基本操作;3. 队列的实现方法,包括顺序队列和链式队列,分别使用数组和链表来实现队列的基本操作;4. 链表的实现方法,包括单链表、双链表和循环链表,分别使用指针链、双向链和循环链来实现链表的基本操作;5. 综合应用,使用各种数据结构来解决实际问题,例如使用栈来实现括号匹配、使用队列来实现马铃薯游戏等。
实验步骤及结果:1. 线性表的实现方法:a) 顺序表的基本操作:创建表、插入元素、删除元素、查找元素等;b) 链表的基本操作:插入节点、删除节点、查找节点等;c) 比较顺序表和链表的优缺点,分析适用场景。
结果:通过实验,确认了顺序表适用于频繁查找元素的情况,而链表适用于频繁插入和删除节点的情况。
2. 栈的实现方法:a) 顺序栈的基本操作:进栈、出栈、判空、判满等;b) 链式栈的基本操作:进栈、出栈、判空、判满等。
结果:通过实验,掌握了栈的基本操作,并了解了栈的特性和应用场景,例如括号匹配。
3. 队列的实现方法:a) 顺序队列的基本操作:入队、出队、判空、判满等;b) 链式队列的基本操作:入队、出队、判空、判满等。
结果:通过实验,掌握了队列的基本操作,并了解了队列的特性和应用场景,例如马铃薯游戏。
4. 链表的实现方法:a) 单链表的基本操作:插入节点、删除节点、查找节点等;b) 双链表的基本操作:插入节点、删除节点、查找节点等;c) 循环链表的基本操作:插入节点、删除节点、查找节点等。
结果:通过实验,掌握了链表的基本操作,并了解了链表的特性和应用场景。
数据结构实验报告总结反思

数据结构实验报告总结反思引言在本学期的数据结构实验课程中,我们学习了各种常用的数据结构和算法,并进行了相应的实验操作。
通过实验,我们巩固了理论知识,并锻炼了自己的编程能力和问题解决能力。
在本次实验报告中,我将对我所学到的内容进行总结和反思,并讨论未来的学习计划和改进方法。
总结学习内容在实验课程中,我学习了以下数据结构和算法:1. 线性表:包括顺序表和链表,学会了它们的插入、删除和查找操作。
2. 栈和队列:熟悉了它们的特性和基本操作,并应用到实际问题中。
3. 二叉树:了解了树的定义和遍历方法,熟悉了二叉搜索树的操作。
4. 图:学习了图的基本概念和表示方法,实现了图的遍历和最短路径算法。
5. 排序算法:掌握了冒泡排序、选择排序、插入排序、快速排序等排序算法的原理和实现。
实验操作在每次实验中,我都认真阅读了实验指导书,并按照指导书上的要求进行了实验操作。
通过自己的努力,我成功地实现了实验要求,并得到了正确的结果。
实验操作中,我尽量养成了规范的编程习惯,包括良好的命名、合理的代码结构和注释等。
这有助于提高代码的可读性和可维护性。
实验收获通过实验,我对数据结构和算法有了更深入的理解,巩固了相关知识。
在实验过程中,我遇到了一些问题,并学会了解决它们。
同时,实验也锻炼了我的编程能力和解决问题的能力。
通过不断地思考和实践,我提高了自己的代码质量和效率,并学会了如何写出更优雅的代码。
反思遇到的问题在实验过程中,我遇到了一些问题,其中包括以下几点:1. 对于一些复杂的数据结构和算法,理解起来较为困难。
我需要花费更多的时间来学习和掌握这些内容。
2. 在某些情况下,实验指导书的说明不够清晰。
我需要仔细阅读并进行补充学习,以理解实验的要求和实现思路。
3. 在编写代码时,我有时会犯一些低级错误,比如数组越界、指针错误等。
我需要更加细心和谨慎地编写代码,以避免这些错误的发生。
改进方法为了提升自己的学习效果和编程能力,我计划采取以下改进方法:1. 增加学习时间。
数据结构实验总结
数据结构实验总结数据结构实验是计算机科学与技术专业的一门重要实践课程,通过实际操作和实验验证,帮助学生理解和掌握各种常见的数据结构及其应用。
本文将对数据结构实验进行总结,包括实验目的、实验内容、实验过程和实验收获等方面。
一、实验目的数据结构实验的主要目的是帮助学生:1. 理解数据结构的基本概念和原理;2. 掌握各种数据结构的特点、操作和应用场景;3. 学会使用编程语言实现各种数据结构;4. 分析和解决实际问题时,选择合适的数据结构和算法。
二、实验内容数据结构实验通常包括以下几个方面的内容:1. 线性表:实现顺序表和链表,并比较它们在插入、删除、查找等操作上的性能差异;2. 栈和队列:实现顺序栈、链栈、顺序队列和链队列,并应用于实际问题中;3. 树:实现二叉树、二叉搜索树、平衡二叉树等,并进行遍历、插入、删除等操作;4. 图:实现有向图和无向图,并进行深度优先搜索和广度优先搜索;5. 排序和查找:实现各种排序算法(如冒泡排序、插入排序、快速排序等)和查找算法(如顺序查找、二分查找等);6. 哈希表:实现哈希表,并解决冲突问题;7. 字符串:实现字符串的匹配算法(如KMP算法);8. 综合实验:综合应用各种数据结构解决实际问题。
三、实验过程数据结构实验的进行通常包括以下几个步骤:1. 理解实验要求和目标,阅读实验指导书和相关资料;2. 设计实验方案,包括选择适当的数据结构和算法,并合理安排实验的步骤和操作;3. 编写程序代码,实现所选数据结构及其相关操作;4. 运行程序,测试和调试,确保程序的正确性和稳定性;5. 进行实验数据的收集和分析,比较不同数据结构和算法的性能差异;6. 总结实验结果,得出结论,分析实验中遇到的问题及解决方法;7. 撰写实验报告,包括实验目的、内容、过程、结果和分析等内容。
四、实验收获通过数据结构实验的学习和实践,我获得了以下几方面的收获:1. 对各种常见的数据结构有了更深入的理解,包括它们的特点、操作和应用场景;2. 学会使用编程语言实现各种数据结构,并掌握了相应的算法;3. 锻炼了分析和解决实际问题的能力,能够选择合适的数据结构和算法;4. 培养了团队合作和沟通能力,在与同学们一起完成实验任务的过程中,学会了相互配合和交流;5. 培养了耐心和细致的工作态度,实验过程中需要不断调试和优化,要求我保持耐心和细致地分析问题。
数据结构实验报告及心得体会
数据结构实验报告及心得体会一、概述:介绍本次实验的目的、背景以及所使用的实验环境和工具。
本次实验旨在通过实际操作,深入理解和掌握数据结构的原理及应用。
实验背景源于课程学习的理论知识与实际应用相结合的需求,通过实验操作,期望能够将课堂所学的数据结构知识更好地运用到实际编程和解决现实问题中。
本次实验所使用的实验环境为先进的计算机实验室,配备了高性能的计算机硬件和丰富的软件开发工具。
为了完成实验,我使用了Java编程语言,并结合Eclipse开发环境进行编程和调试。
我还参考了相关的数据结构专业书籍和在线资源,以便更好地理解和应用数据结构知识。
在实验过程中,我严格按照实验指导书的步骤进行操作,并认真记录了实验数据和结果。
通过本次实验,我深刻体会到了数据结构的重要性,也对数据结构的实现和应用有了更深入的了解。
二、实验内容:分别介绍线性数据结构(线性表)、非线性数据结构(二叉树、图)的实验内容,包括其实现方法、操作过程等。
每个实验都包含具体的实验目的和预期结果。
三、实验过程及结果分析:详细描述实验过程,包括实验步骤的执行情况,遇到的问题及解决方法。
对实验结果进行展示,并进行数据分析和结论。
这部分是实验报告的核心部分,体现了学生的实践能力和问题解决能力。
四、心得体会:分享在实验过程中的心得体会,包括遇到的困难、收获,对数据结构的理解与认识提升,以及实验过程中的团队协作和学习体验等。
这部分内容可以体现出学生的思考深度和学习的主观感受。
五、总结与展望:对本次实验报告进行总结,并对未来数据结构与算法的学习提出展望和建议。
这部分内容可以帮助学生梳理所学知识,明确未来的学习方向。
数据结构实验报告及心得体会
数据结构实验报告及心得体会一、引言数据结构是计算机科学中的重要基础课程,通过实验环节的学习,我们能够更好地掌握和应用数据结构的概念、算法和操作。
本报告旨在总结和分享我们进行的数据结构实验,并提出相应的心得体会。
二、实验一:线性表的实现与应用1. 实验目的本实验旨在通过实现和应用线性表的基本操作,掌握线性表的存储结构和算法。
2. 实验内容我们选择了顺序表和链表两种线性表的实现方式,并实现了插入、删除和查找等基本操作。
通过实验,我们发现顺序表适用于元素个数较少、频繁查找的情况,而链表适用于插入和删除操作较多、元素个数不确定的情况。
3. 实验心得通过实验一,我们深刻认识到数据结构的不同实现方式对算法的影响。
选择合适的数据结构可以提高算法效率,提高程序的性能。
同时,我们也意识到了在实际应用中,根据问题的具体特点选择不同的数据结构才能得到最优解。
三、实验二:栈与队列的应用本实验旨在通过实现和应用栈和队列的基本操作,掌握栈和队列的特性及其在实际应用中的作用。
2. 实验内容我们分别实现了顺序栈、链式栈、顺序队列和链式队列,并实现了入栈、出栈、入队和出队等基本操作。
我们发现栈适用于实现回溯算法、递归算法等,而队列适用于广度优先搜索、线程池等场景。
3. 实验心得通过实验二,我们进一步理解了栈和队列在实际编程中的运用。
它们提供了方便的数据结构,帮助我们解决了许多实际问题。
同时,实验过程中,我们也发现了栈溢出的问题,意识到了合理管理栈空间的重要性。
四、实验三:树与二叉树的实现与应用1. 实验目的本实验旨在通过实现和应用树和二叉树的基本操作,掌握树和二叉树的存储结构和算法。
2. 实验内容我们实现了树和二叉树的基本操作,包括创建、插入、删除和遍历等。
通过实验,我们发现树在表示具有部分层次结构的问题时更合适,而二叉树在表示递归结构时更加方便。
通过实验三,我们深入理解了树和二叉树的特性及其应用。
树和二叉树是许多高级数据结构的基础,熟练掌握它们的操作对于解决实际问题非常重要。
优秀数据结构实践报告体会范文(15篇)
优秀数据结构实践报告体会范文(15篇)优秀数据结构实践报告体会范文(15篇)篇一随着个人的文明素养不断提升,报告的使用成为日常生活的常态,报告具有成文事后性的特点。
那么报告应该怎么写才合适呢?下面是小编收集整理的体会社会实践报告,希望对大家有所帮助。
大学的第二个暑假到来了,应学校的提议和社会对大学生的要求,我参加了暑期社会实践活动。
在这又一次的活动中,我学到了很多,也感悟了很多。
下面就我这次暑期社会实践的心得做一总结。
因为我是计算机学院的学生,所以我在这学期的社会实践中去了家附近的塑料厂帮助整理资料和制作表格。
暑期社会实践,是我们大学生充分利用暑期的时间,以各种方式深入社会之中展开形式多样的各种实践活动。
积极地参加社会实践活动,能够促进我们对社会的了解,提高自身对经济和社会发展现状的认识,实现书本知识和实践知识的更好结合,帮助我们树立正确的世界观、人生观和价值观;大学生社会实践活动是全面推进素质教育的重要环节,是适应新世纪社会发展要求,培养全面发展型人才的需要,是加强集体主义,爱国主义,社会主义教育,升华思想的有效途径。
积极投身社会实践,深入群众,了解社会,增长才干,是青年学生成长成才的正确道路,是青年学生运用所学知识技能,发挥聪明才智,积极为社会作贡献的重要途径。
暑期社会实践则恰恰为我们提供了一个走出校园,踏上社会,展现自我的绚丽舞台。
利用假期参加有意义的社会实践活动,接触社会,了解社会,从社会实践中检验自我。
在实践中积累社会经验,在实践中提高自己的能力,这将为我们以后走出社会打下坚实的基础!年少轻狂,经受不住暴雨的洗礼?谁说象牙塔里的我们两耳不闻窗外事,一心只读圣贤书?走出校园,踏上社会,我们能否不辜负他人的`期望,为自己书写一份满意的答卷。
在注重素质教育的今天,大学生假期社会实践作为促进大学生素质教育,加强和改进青年学生思想政治工作,引导学生健康成长成才的重要举措,作为培养和提高学生实践、创新和创业能力的重要途径,一直来深受学校的高度重视。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构实验总结报告
一、调试过程中遇到哪些问题?
(1)在二叉树的调试中,从广义表生成二叉树的模块花了较多时间调试。
由于一开始设计的广义表的字符串表示没有思考清晰,处理只有一个孩子的节点时发生了混乱。
调试之初不以为是设计的问题,从而在代码上花了不少时间调试。
目前的设计是:
Tree = Identifier(Node,Node)
Node = Identifier | () | Tree
Identifier = ASCII Character
例子:a(b((),f),c(d,e))
这样便消除了歧义,保证只有一个孩子的节点和叶节点的处理中不存在问题。
(2)Huffman树的调试花了较长时间。
Huffman编码本身并不难处理,麻烦的是输入输出。
①Huffman编码后的文件是按位存储的,因此需要位运算。
②文件结尾要刷新缓冲区,这里容易引发边界错误。
在实际编程时,首先编写了屏幕输入输出(用0、1表示二进制位)的版本,然后再加入二进制文件的读写模块。
主要调试时间在后者。
二、要让演示版压缩程序具有实用性,哪些地方有待改进?
(1)压缩文件的最后一字节问题。
压缩文件的最后一字节不一定对齐到字节边界,因此可能有几个多余的0,而这些多余的0可能恰好构成一个Huffman编码。
解码程序无法获知这个编码是否属于源文件的一部分。
因此有的文件解压后末尾可能出现一个多余的字节。
解决方案:
①在压缩文件头部写入源文件的总长度(字节数)。
需要四个字节来存储这个信息(假定文件长度不超过4GB)。
②增加第257个字符(在一个字节的0~255之外)用于EOF。
对于较长的文件,
会造成较大的损耗。
③在压缩文件头写入源文件的总长度%256的值,需要一个字节。
由于最后一个字节存在或不存在会影响文件总长%256的值,因此可以根据这个值判断整个压缩文件的最后一字节末尾的0是否在源文件中存在。
(2)压缩程序的效率问题。
在编写压缩解压程序时
①编写了屏幕输入输出的版本
②将输入输出语句用位运算封装成一次一个字节的文件输入输出版本
③为提高输入输出效率,减少系统调用次数,增加了8KB的输入输出缓存窗口
这样一来,每写一位二进制位,就要在内部进行两次函数调用。
如果将这些代码合并起来,再针对位运算进行一些优化,显然不利于代码的可读性,但对程序的执行速度将有一定提高。
(3)程序界面更加人性化。
Huffman Tree Demo (C) 2011-12-16 boj
Usage: huffman [-c file] [-u file] output_file
-c Compress file. e.g. huffman -c test.txt test.huff
-u Uncompress file. e.g. huffman -u test.huff test.txt
目前的程序提示如上所示。
如果要求实用性,可以考虑加入其他人性化的功能。
三、调研常用的压缩算法,对这些算法进行比较分析
(一)无损压缩算法
①RLE
RLE又叫Run Length Encoding,是一个针对无损压缩的非常简单的算法。
它用重复字节和重复的次数来简单描述来代替重复的字节。
尽管简单并且对于通常的压缩非常低效,但它有的时候却非常有用(例如,JPEG就使用它)。
变体1:重复次数+字符
文本字符串:A A A B B B C C C C D D D D,编码后得到:3 A 3 B 4 C 4 D。
变体2:特殊字符+重复次数+字符
文本字符串:A A A A A B C C C C B C C C,编码后得到:B B 5 A B B 4 C B B 3 C。
编码串的最开始说明特殊字符B,以后B后面跟着的数字就表示出重复的次数。
变体3:把文本每个字节分组成块,每个字符最多重复127 次。
每个块以一个特殊字节开头。
那个特殊字节的第7 位如果被置位,那么剩下的7位数值就是后面的字符的重复次数。
如果第7 位没有被置位,那么剩下7 位就是后面没有被压缩的字符的数量。
例如:文本字符串:A A A A A B C D E F F F。
编码后得到:85 A 4 B C D E 83 F(85H= 10000101B、4H= 00000100B、83H= 10000011B)
②Huffman
哈夫曼编码是无损压缩当中最好的方法。
它使用预先二进制描述来替换每个符号,长度由特殊符号出现的频率决定。
常见的符号需要很少的位来表示,而不常见的符号需要很多为来表示。
哈夫曼算法在改变任何符号二进制编码引起少量密集表现方面是最佳的。
然而,它并不处理符号的顺序和重复或序号的序列。
③Rice
Rice编码背后的基本思想是尽可能的用较少的位来存储多个字(正像使用哈夫曼编码一样)。
实际上,Rice类似静态的哈夫曼编码(例如,编码不是由实际数据内容的统计信息决定,而是由小的值比高的值常见的假定决定)。
编码非常简单:将值X用X个‘1’位之后跟一个0位来表示。
对于由大word(例如:16或32位)组成的数据和教低的数据值,Rice编码能够获得较好的压缩比。
音频和高动态变化的图像都是这种类型的数据,它们被预处理过(例如delta相邻的采样)。
尽管哈夫曼编码处理这种数据是最优的,却由于几个原因而不适合处理这种数据(例如:32位大小要求16GB的柱状图缓冲区来进行哈夫曼树编码)。
因此一个比较动态的方式更适合由大word组成的数据。
④LZ77
在LZ压缩算法的背后是使用RLE算法用先前出现的相同字节序列的引用来替代。