数据结构与算法分析实验报告(川大)
- 格式:docx
- 大小:494.03 KB
- 文档页数:20
数据结构与算法实验报告一、实验目的1.学习并掌握线性表的链式存储结构和链表的基本操作;2.掌握链表的插入、删除、查找等基本操作算法的实现;3.了解链表的应用场景。
二、实验内容与过程本次实验主要包括以下实验内容:1.链表的定义与建立;2.链表的插入操作;3.链表的删除操作;4.链表的查找操作;5.链表的遍历操作;6.链表的逆序操作;7.链表的合并操作。
实验过程如下:1.链表的定义与建立首先,我们定义一个链表的结构,其中包括节点的定义,节点的数据域和指针域。
节点的数据域存放具体的数据,指针域用于指向下一个节点。
```typedef struct Nodeint data;struct Node* next;} Node;```然后,我们定义链表的头指针,并初始化为空链表。
```Node* head = NULL;```2.链表的插入操作插入操作是指在链表中间或末尾插入一个新节点。
首先,我们创建一个新节点,并为其分配内存空间。
```Node* newNode = (struct Node*) malloc(sizeof(Node));newNode->data = 10;newNode->next = NULL;```然后,我们遍历链表,找到插入位置。
```Node* current = head;while (current->next != NULL)current = current->next;```最后,我们将新节点插入到链表中。
```current->next = newNode;```3.链表的删除操作删除操作是指删除链表中的一些节点。
首先,我们找到要删除的节点的前一个节点。
```Node* current = head;while (current->next != NULL && current->next->data != data) current = current->next;```然后,我们将要删除的节点的指针域赋值给前一个节点的指针域。
数据结构与算法分析实验报告一、实验目的本次实验旨在通过实际操作和分析,深入理解数据结构和算法的基本概念、原理和应用,提高解决实际问题的能力,培养逻辑思维和编程技巧。
二、实验环境本次实验使用的编程语言为 Python,使用的开发工具为 PyCharm。
操作系统为 Windows 10。
三、实验内容(一)线性表的实现与操作1、顺序表的实现使用数组实现顺序表,包括插入、删除、查找等基本操作。
通过实验,理解了顺序表在内存中的存储方式以及其操作的时间复杂度。
2、链表的实现实现了单向链表和双向链表,对链表的节点插入、删除和遍历进行了实践。
体会到链表在动态内存管理和灵活操作方面的优势。
(二)栈和队列的应用1、栈的实现与应用用数组和链表分别实现栈,并通过表达式求值的例子,展示了栈在计算中的作用。
2、队列的实现与应用实现了顺序队列和循环队列,通过模拟银行排队的场景,理解了队列的先进先出特性。
(三)树和二叉树1、二叉树的遍历实现了先序、中序和后序遍历算法,并对不同遍历方式的结果进行了分析和比较。
2、二叉搜索树的操作构建了二叉搜索树,实现了插入、删除和查找操作,了解了其在数据快速查找和排序中的应用。
(四)图的表示与遍历1、邻接矩阵和邻接表表示图分别用邻接矩阵和邻接表来表示图,并比较了它们在存储空间和操作效率上的差异。
2、图的深度优先遍历和广度优先遍历实现了两种遍历算法,并通过对实际图结构的遍历,理解了它们的应用场景和特点。
(五)排序算法的性能比较1、常见排序算法的实现实现了冒泡排序、插入排序、选择排序、快速排序和归并排序等常见的排序算法。
2、算法性能分析通过对不同规模的数据进行排序实验,比较了各种排序算法的时间复杂度和空间复杂度。
四、实验过程及结果(一)线性表1、顺序表在顺序表的插入操作中,如果在表头插入元素,需要将后面的元素依次向后移动一位,时间复杂度为 O(n)。
删除操作同理,在表头删除元素时,时间复杂度也为 O(n)。
数据结构实验报告题目:线性表班级:网络工程1401班学号: 1408020106指导教师:高峰日期: 2016/7/6实验一:线性表一:实验要求掌握数据结构中线性表的基本概念。
熟练掌握线性表的基本操作:创建、插入、删除、查找、输出、求长度及合并并运算在顺序存储结构撒谎能够的实验。
熟练掌握链表的各种操作和应用。
二.实验内容1. 编程实现在顺序存储的有序表中插入一个元素(数据类型为整型)。
2. 编程实现把顺序表中从i个元素开始的k个元素删除(数据类型为整型)。
三:实验过程及步骤源代码:#include<stdio.h>#include<malloc.h>#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef struct{int * elem;int length;int listsize;}SqList;//SqList sq;void InitList_Sq(SqList *sq) //初始化列表{sq->elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));sq->length=0;sq->listsize=LIST_INIT_SIZE;printf("---申请空间成功---!\n");}void GetElem(SqList *sq,int i)//获取第i位置元素的值{int *p;p=&(sq->elem[i-1]);printf("%d",*p);printf("\n");}int ListInsert_Sq(SqList *sq,int i,int a)//在i位置之前插入a{int *p,*q;if(i<=0||i>sq->length+1){printf("---位置不合法---!\n");return 0;}if(sq->length>=sq->listsize){int* newbase=(int *)realloc(sq->elem,(sq->listsize+LISTINCREMENT)*sizeof(int)); if(!newbase){printf("申请空间溢出\n");return 0;}sq->elem=newbase;sq->listsize+=LISTINCREMENT;}p=&(sq->elem[i-1]);//p指向第i位置的元素q=&(sq->elem[sq->length-1]);//q指向最后一个元素for(;q>=p;--q) *(q+1)=*q;*p=a;++sq->length;return 1;}int ListDelete_Sq(SqList *sq,int i) //删除i位置上的值{int *p,*q;if(i<1||i>sq->length) return 0;p=&(sq->elem[i-1]);//p指向第i位置的元素q=sq->elem+sq->length-1;//q指向最后一个元素for(++p;p<=q;++p){*(p-1)=*p;}--sq->length;return 1;}void visit(SqList *sq)//输出数据{int i=1;for(;i<=sq->length;i++){int *p;p=&sq->elem[i-1];printf("%d",*p);printf(" ");}}void main(){int i=1,a=0,boo=1,number=0;SqList s,*sq;sq=&s;InitList_Sq(sq);printf("初始化空表\n");printf("输入数据个数:\n");scanf("%d",&number);printf("输入%d个数据:",number);printf("\n");for(;i<=number;i++){scanf("%d",&a);if(boo=ListInsert_Sq(sq,i,a)){printf("---插入成功!---\n");}else{printf("---插入不成功,重新插入---!\n"); i=i-1;}}printf("输出所有元素\n");visit(sq);printf("\n");printf("输出删除的位置:");scanf("%d",&a);if(boo=ListDelete_Sq(sq,a)){printf("---数据删除成功!---\n");}else{printf("---没有删除成功---\n");}printf("输出所有元素:\n");visit(sq);printf("\n");printf("输出要显示数据的位置:");scanf("%d",&a);printf("输出%d位置数值\n",a);if(a<0||a>sq->length){printf("---输出位置的数据不存在---\n");}else{GetElem(sq,a);}}步骤:1.初始化空表2.顺序插入数据后输出所有元素3.选择删除位置,删除数据后输出所有元素4.选择查看的数据位置,输出选择查看的数据四:实验结果及分析分析:本程序在实现顺序存储插入以及删除i个元素开始的k个元素删除(数据类型为整型)。
《数据结构与算法》综合实验报告系别:专业:学生姓名:指导教师:2011年 11月 25日实验目的掌握线性表的建立、插入、删除算法;掌握查找算法;掌握排序算法;实验要求使用C语言(环境任意)开发程序,能够对用户输入的任意一组数据,建立一个线性表,可以输出此线性表。
并且能够对此线性表进行插入、删除、查找、排序等操作。
程序流程建表如下:定义一个整型的数据类型data和next指针:定义头指针和当前结点指针,申请连续空间将单个字节大小复制给头指针,把头指针赋值给当前节点指针:若输入的数是0,则若输入不为0,把输入的数赋值给已申请的新结点,把新结点赋给当前节点的next域,再把新结点赋值给当前结点,以此方法重复执行得到如下链表:输出函数:把头指针赋值给当前结点指针,当当前节点的next域不为空时输出当前节点所指向的数据,把当前结点的next域赋值给当前节点,否则输出链表为空对此线性表进行插入、删除、查询、排序操作把已申请的结点数据域指向所输入的数再把插入w结点赋值头结点,是插入的位置,如果w=0则插入结点的next域赋值给头结点否则如果w>表长,则输出超出范围代码及运行结果(主要语句要求有注释)#include"stdafx.h"#include<stdio.h>#include<malloc.h>#define NULL 0typedef struct linknode{int data;struct linknode *next;}node;node *head;node *creat(){node *currnode,*newnode;int x;head=(node*)malloc(sizeof(node));currnode=head;do{scanf("%d",&x);newnode=(node*)malloc(sizeof(node));newnode->data=x;currnode->next=newnode;currnode=newnode;}while(x!=NULL);head=head->next;currnode->next=NULL;return head;};int length(){node *currnode;int i=0;currnode=head;while(currnode->data!=NULL){currnode=currnode->next;i++;};return i;};void print(){node *currnode;currnode=head;printf("链表如下....linklist");while(currnode->data!=NULL){printf("%d-->",currnode->data);currnode=currnode->next;};printf("NULL\n");printf("链表长度为........linklist length%d\n",length());};void delete1(){int x;node *delnode,*currnode;printf("输入要删除的数据......input delete data:");scanf("%d",&x);if(head->data==NULL) printf("此链表为空无法删除.....this linklist empty!\n"); if(head->data==x){delnode=head;head=head->next;free(delnode);if(head==NULL) printf("此链表为空.......this linklist enpty!");}else{currnode=head;delnode=currnode->next;while(delnode->data!=x&&delnode!=NULL){currnode=currnode->next;delnode=currnode->next;};if(delnode==NULL)printf("无此数据......no this data!\n");else{currnode->next=delnode->next;free(delnode);};};};void find(){node *currnode;int count=1,x;currnode=head;printf("输入要查找的数据.......input search data:");scanf("%d",&x);while(currnode->data!=NULL&&currnode->data!=x) {currnode=currnode->next;count++;};if(currnode->data!=NULL){printf("\n%d为第........is no.",currnode->data);printf("%d个数据........data。
竭诚为您提供优质文档/双击可除数据结构与算法实验报告篇一:数据结构与算法实验报告-图沈阳工程学院学生实验报告(课程名称:数据结构与算法)实验题目:班级网络本112学号27姓名郑乐乐地点F606指导教师吕海华祝世东实验日期:20XX年11月13日1234篇二:《数据结构与算法》实验报告模板软件工程系实验报告封面课程名称:数据结构与算法课程代码:ss1005实验指导老师:钟迅科实验报告名称:本实验报告包括以下几个内容:一、实验(实践)目的二、实验(实践)环境三、实验(实践)实现过程四、实验(实践)分析与总结五、指导教师评语与评分我申明,本报告内的实验已按要求完成,报告完全是由我个人完成,并没有抄袭行为。
我已经保留了这份实验报告的副本。
申明人(签名):学生姓名:张三学号:1140888888教学班:FJ01递交日期:20XX年10月11日篇三:数据结构与算法实验报告c++版算法与数据结构实验报告实验一:栈与队列一、实验目的1、掌握栈和队列特点、逻辑结构和存储结构2、熟悉对栈和队列的一些基本操作和具体的函数定义。
3、利用栈和队列的基本操作完成一定功能的程序。
二、实验任务1.出顺序栈的类定义和函数实现,利用栈的基本操作完成十进制数n与其它d进制数的转换。
(如n=1357,d=8)2.给出顺序队列的类定义和函数实现,并利用队列计算并打印杨辉三角的前n行的内容。
(n=8)3.给出链栈的类定义和函数实现,并设计程序完成如下功能:读入一个有限大小的整数n,并读入n个数,然后按照与输入次序相反的次序输出各元素的值。
三、实验原理1、将十进制数n转化为d进制时,用除去余数法,用d 除n所得余数作为d进制当前个位,将相除所得的商的整数部分作为新的n值重复上述计算,直到n为0为止。
将前所得到的各余数反过来连接便得到最终结果。
将每次求出的余数入栈,求解结束后,再依次出栈。
2、在杨辉三角中可用上一行的数来求出对应位置的下一行的内容。
数据结构与算法实验报告实验目的:本次实验主要目的是掌握数据结构与算法的基本概念和实际应用。
通过设计和实现特定的数据结构和算法,加深对其原理和应用的理解,培养分析和解决实际问题的能力。
实验内容:本次实验包括以下几个部分:1\实验环境和工具介绍在本部分,将介绍实验所使用的开发环境和工具,包括操作系统、编程语言、集成开发环境等。
2\实验设计和思路本部分将详细介绍实验的设计思路、算法的选择和实现方式。
具体包括数据结构的选择、算法的设计原理、时间和空间复杂度分析等。
3\实验步骤和代码实现在本部分,将详细列出实验的具体步骤和算法的实现代码。
包括数据结构的定义和操作、算法的实现和测试数据的等。
4\实验结果和分析在本部分,将展示实验的运行结果,并对实验结果进行分析和讨论。
包括实际运行时间、空间占用、算法的优缺点等方面的讨论。
5\实验总结和思考在本部分,将对整个实验进行总结和思考。
包括实验过程中遇到的问题和解决方法,对实验结果的评价,以及对进一步的研究方向的思考等内容。
附件:本文档附带以下附件:1\源代码:包括数据结构的定义和操作,算法的实现等。
2\测试数据:用于验证算法实现的测试数据。
3\实验结果截图:包括算法运行结果、时间和空间占用等方面的截图。
法律名词及注释:1\数据结构:在计算机科学中,数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
2\算法:算法是解决问题的一系列清晰而简明的指令,是计算或操作的一种良定义的规程。
3\时间复杂度:时间复杂度是度量算法运行时间长短的一个表达式,用大O符号表示。
4\空间复杂度:空间复杂度是度量算法运行过程中所需的存储空间的一个表达式,用大O符号表示。
结语:本文档详细介绍了数据结构与算法实验的设计思路、步骤和实现代码,并对实验结果进行了分析和讨论。
实验过程中,我们掌握了数据结构与算法的基本概念和实际应用,提高了问题解决能力和编程实践能力。
2015-2016学年第二学期《算法与数据结构》课程实验报告专业软件工程学生姓名成晓伟班级软件141学号1410075094实验学时16实验教师徐秀芳信息工程学院实验一单链表的基本操作一、实验目的1.熟悉C语言上机环境,进一步掌握C语言的基本结构及特点。
2.掌握线性表的各种物理存储表示和C语言实现。
3.掌握单链表的各种主要操作的C语言实现。
4.通过实验理解线性表中的单链表存储表示与实现。
二、主要仪器及耗材普通计算机三、实验内容与要求1、用C语言编写一个单链表基本操作测试程序。
(1)初始化单链表(2)创建单链表(3)求单链表长度(4)输出单链表中每一个结点元素(5)指定位置插入某个元素(6)查找第i个结点元素的值(7)查找值为e 的结点,并返回该结点指针(8)删除第i个结点(9)销毁单链表2、实验要求(1)程序中用户可以选择上述基本操作。
程序启动后,在屏幕上可以菜单形式显示不同功能,当按下不同数字后完成指定的功能,按其他键,则显示错误后重新选择。
(2)要求用线性表的顺序存储结构,带头结点的单链表存储结构分别实现。
(3)主函数实现对基本操作功能的调用。
3、主要代码(1)初始化单链表LinkList *InitList(){ //创建一个空链表,初始化线性表LinkList *L;L=(LinkList *)malloc(sizeof(LinkList));L->next=NULL;return L;}(2)创建单链表//头插法void CreateListF(LinkList *L){LinkList *s;int i=1,a=0;while(1){printf("输入第%d个元素(0表示终止)",i++);scanf("%d",&a);if(a==0)break;s=(LinkList *)malloc(sizeof(LinkList));s->data=a;s->next=L->next;L->next=s;}}(3)求链表长度int ListLength(LinkList *L){ //求链表长度int n=0;LinkList *p=L;while(p->next!=NULL){p=p->next;n++;}return(n);}(4)在指定位置插入元素int InsertList(LinkList *L,int i,ElemType e){LinkList *p=L,*s;int j=0;while(p!=NULL&&j<i-1){p=p->next;j++;} //找出要插入的位置的前一个位置if(p==NULL){return 0;}else{s=(LinkList *)malloc(sizeof(LinkList));s->data=e;s->next=p->next;p->next=s;return 1;}}(5)输出链表void DispList(LinkList *L){ //输出链表LinkList *p=L->next;while(p!=NULL){printf("%d",p->data);p=p->next;}printf("\n");}(6)查找链表中指定元素int GetElem(LinkList *L,int i){ //查找链表中指定元素LinkList *p=L;int j=0;while(j<i&&p!=NULL){j++;p=p->next;}if(p==NULL){return 0;}else{return p->data;}}(7)查找值是e的结点并返回该指针LinkList *LocateElem(LinkList *L,ElemType e){ //查找值是e的结点并返回该指针int i=1;LinkList *p=L;while(p!=NULL)if(p->data==e) return p;}if(p==NULL){return NULL;}}(8)删除元素int ListDelete(LinkList *L,int i,ElemType *e){ //删除元素LinkList *p=L,*q;int j=0;while(p!=NULL&&j<i-1){p=p->next;j++;} //找到要删除元素地址的前一个地址if(p==NULL){ return 0;} //不能删除else{q=p->next;*e=q->data;p->next=q->next;free(q); //删除成功return 1;}}(9)销毁链表void DestroyList(LinkList *L){//销毁链表LinkList *pre=L,*p=L->next;while(p!=NULL){free(pre);pre=p;p=pre->next;}free(pre);}main函数:int main(){LinkList *L;ElemType e;int i;L=InitList();CreateListF(L);DispList(L);printf("输入要查找的元素位置:\n");scanf("%d",&i);e=GetElem(L,i);printf("%d\n",e);printf("单链表长度为:%d\n",ListLength(L));printf("输入要删除元素的位置:");scanf("%d",&i);if (i>ListLength(L)){printf("超出范围重新输入");scanf("%d",&i);}if(ListDelete(L,i,&e)==0){printf("未找到元素\n");}else DispList(L);printf("输入插入元素的位置和值:");scanf("%d%d",&i,&e);InsertList(L,i,e);DispList(L);return 0;}4、测试数据及测试结果输入:23 56 12 28 45输出:四、注意事项1、存储结构定义和基本操作尽可能用头文件实现。
算法与及数据结构实验报告算法与数据结构实验报告一、实验目的本次算法与数据结构实验的主要目的是通过实际操作和编程实现,深入理解和掌握常见算法和数据结构的基本原理、特性和应用,提高我们解决实际问题的能力和编程技巧。
二、实验环境本次实验使用的编程语言为 Python,开发环境为 PyCharm。
同时,为了进行算法性能的分析和比较,使用了 Python 的 time 模块来计算程序的运行时间。
三、实验内容1、线性表的实现与操作顺序表的实现:使用数组来实现顺序表,并实现了插入、删除、查找等基本操作。
链表的实现:通过创建节点类来实现链表,包括单向链表和双向链表,并完成了相应的操作。
2、栈和队列的应用栈的实现与应用:用数组或链表实现栈结构,解决了表达式求值、括号匹配等问题。
队列的实现与应用:实现了顺序队列和循环队列,用于模拟排队系统等场景。
3、树结构的探索二叉树的创建与遍历:实现了二叉树的先序、中序和后序遍历算法,并对其时间复杂度进行了分析。
二叉搜索树的操作:构建二叉搜索树,实现了插入、删除、查找等操作。
4、图的表示与遍历邻接矩阵和邻接表表示图:分别用邻接矩阵和邻接表来存储图的结构,并对两种表示方法的优缺点进行了比较。
图的深度优先遍历和广度优先遍历:实现了两种遍历算法,并应用于解决路径查找等问题。
5、排序算法的比较插入排序、冒泡排序、选择排序:实现了这三种简单排序算法,并对不同规模的数据进行排序,比较它们的性能。
快速排序、归并排序:深入理解并实现了这两种高效的排序算法,通过实验分析其在不同情况下的表现。
6、查找算法的实践顺序查找、二分查找:实现了这两种基本的查找算法,并比较它们在有序和无序数据中的查找效率。
四、实验步骤及结果分析1、线性表的实现与操作顺序表:在实现顺序表的插入操作时,如果插入位置在表的末尾或中间,需要移动后续元素以腾出空间。
删除操作同理,需要移动被删除元素后面的元素。
在查找操作中,通过遍历数组即可完成。
《数据结构与算法》实验报告班级:学生学号:学生姓名:学生电话:指导教师:1. 按时完成实验;2. 实验内容和过程记录完整;3.问题解答完整、正确;4.有实验的心得或讨论;5.实验报告的撰写认真、格式符合要求,没有抄袭行为。
教师签名:1. 按时完成实验;2. 实验内容和过程记录完整;3.问题解答完整、正确;4.有实验的心得或讨论;5.实验报告的撰写认真、格式符合要求,没有抄袭行为。
教师签名:1. 按时完成实验;2. 实验内容和过程记录完整;3.问题解答完整、正确;4.有实验的心得或讨论;5.实验报告的撰写认真、格式符合要求,没有抄袭行为。
教师签名:1. 按时完成实验;2. 实验内容和过程记录完整;3.问题解答完整、正确;4.有实验的心得或讨论;5.实验报告的撰写认真、格式符合要求,没有抄袭行为。
教师签名:1. 按时完成实验;2. 实验内容和过程记录完整;3.问题解答完整、正确;4.有实验的心得或讨论;5.实验报告的撰写认真、格式符合要求,没有抄袭行为。
教师签名:1. 按时完成实验;2. 实验内容和过程记录完整;3.问题解答完整、正确;4.有实验的心得或讨论;5.实验报告的撰写认真、格式符合要求,没有抄袭行为。
教师签名:1. 按时完成实验;2. 实验内容和过程记录完整;3.问题解答完整、正确;4.有实验的心得或讨论;5.实验报告的撰写认真、格式符合要求,没有抄袭行为。
教师签名:。
《数据结构与算法分析》课程设计报告课题名称:带括号的算数表达式求值课题设计人(学号):指导教师:朱宏评阅成绩:评阅意见:提交报告时间:2014 年12月9日带括号的算数表达式求值计算机类专业学生指导老师朱宏[摘要] 在平时的生活中,我们可以解决一些简单的算术表达式,如果当我们遇到一些式子较为冗长,运算比较复杂的算术表达式时,我们都会选择计算器。
那么,计算器又是通过怎样的原理来进行运算的呢。
本程序利用堆栈先进后出的特点,采用操作数和操作符两个堆栈,实现由中缀表达式到后缀表达式的转换并求值的过程。
带括号的算术表达式的求值是堆栈的一个典型的应用实例。
关键词:计算器堆栈C++一、实验名称:带括号的算术表达式求值二、实验的目的和要求:1.采用算符优先数算法,能正确求值表达式;2.熟练掌握栈的应用;3.熟练掌握计算机系统的基本操作方法,了解如何编辑、编译、链接和运行一个C++程序;4.上机调试程序,掌握查错、排错使程序能正确运行。
三、实验的环境:硬件环境:处理器:Inter(R) Core(TM) i7-4500U内存:8.00GB软件环境:操作系统:Windows8.1编译软件:Microsoft Visual Studio 2012四、算法描述:我设计的带有括号的算术表达式求值的程序中,运算符的优先级是这样子的:1.先乘除,后加减2.同级运算从左到右依次运算。
3.先括号内的运算,再括号外的运算。
我的设计思路是,先输入一个最后不带等于号的中缀表达式,先对表达式检查是否有错误,如果有将会输出“表达式有错误”,否则通过堆栈方法将这个中缀表达式转化为后缀表达式,然后将后缀表达式求值。
transform()——用于将中缀表达式转换为后缀表达式calculate()——将后缀表达式进行求值examine()——检查输入的表达式是否有错误main()——主程序。
五:源程序清单:#include<iostream>#include<cmath>#include<stack>#include<string>using namespace std;string transform(string str)//转换为后缀表达式{stack<char> ope;int i;string exp="";for(i=0;i<int(str.size());i++){if(str[i]=='.'||isdigit(str[i])){exp+=str[i];}else if(str[i]=='+'||str[i]=='-'){int j=i-1;if(isdigit(str[j])){exp+=" ";//每个数字的后面都加一个空格加以区分if(ope.empty()||ope.top()=='('){ope.push(str[i]);}else{while(!ope.empty()&&ope.top()!='('){exp+=ope.top();ope.pop();}ope.push(str[i]);}}else{if(ope.empty()||ope.top()=='(') {ope.push(str[i]);}else{while(!ope.empty()&&ope.top()!='('){exp+=ope.top();ope.pop();}ope.push(str[i]);}}}else if(str[i]=='*'||str[i]=='/'||str[i]=='%') {int j=i-1;if(isdigit(str[j])){exp+=" ";if(ope.empty()||ope.top()=='('||ope.top()=='+'||ope.top( )=='-'){ope.push(str[i]);}else{while(!ope.empty()&&ope.top()!='('&&ope.top()!='+'&&ope.top ()!='-'){exp+=ope.top();ope.pop();}ope.push(str[i]);}}else{if(ope.empty()||ope.top()=='('||ope.top()=='+'||ope.top( )=='-'){ope.push(str[i]);}else{while(!ope.empty()&&ope.top()!='('&&ope.top()!='+'&&ope. top()!='-'){exp+=ope.top();ope.pop();}ope.push(str[i]);}}}//}else if(str[i]=='^'){int j=i-1;if(str[j]!=')'){exp+=" ";}ope.push(str[i]);}else if(str[i]=='('){ope.push(str[i]);}else if(str[i]==')'){exp+=" ";while(ope.top()!='('){exp+=ope.top();ope.pop();}ope.pop();}else{return"有错误";}}while(!ope.empty())//遍历完表达式将堆栈中的所有运算符输出{if(isdigit(exp[exp.length()-1])){exp=exp+" "+ope.top();ope.pop();}else{exp=exp+ope.top();ope.pop();}}return exp;}int examine(string str)//检查输入的表达式是否有误{if((isdigit(str[str.length()-1])!=0||str[str.length()-1] ==')')&&(isdigit(str[0])!=0||str[0]=='+'||str[0]=='-'||str[ 0]=='(')){int i;for(i=0;i<int(str.length());i++){if(str[i]=='/'||str[i]=='%'||str[i]=='*'||str[i]=='^') {int a=i+1;if(str[a]=='/'||str[a]=='*'||str[a]=='%'||str[a]==')'||str[ a]=='.'){cout<<"表达式有错误"<<endl;return 1;break;}}else if(str[i]=='+'||str[i]=='-'){int a=i+1;if(str[a]=='/'||str[a]=='*'||str[a]=='%'||str[a]==')'||s tr[a]=='.'||str[a]=='^'){cout<<"表达式有错误"<<endl;return 1;break;}}else if(isdigit(str[i])!=0){int a=i+1;if(str[a]=='('){cout<<"表达式有错误"<<endl;return 1;break;}}elseif(isdigit(str[i])==0&&str[i]!='+'&&str[i]!='-'&&str[i]!='* '&&str[i]!='/'&&str[i]!='^'&&str[i]!='%'&&str[i]!='('&&str[ i]!=')'&&str[i]!='.'){cout<<"表达式有错误"<<endl;return 1;break;}else if(str[i]=='.'){int a=i+1;if(isdigit(str[a])==0){cout<<"表达式有错误"<<endl;return 1;break;}}while(i==str.length()-1){cout<<"表达式正确"<<endl;return 2;break;}}}elsecout<<"表达式有错误"<<endl;return 1;}double calculate(string exp){stack<double> number;double digit;string str="";for(int i=0;i<int(exp.length());i++){if(isdigit(exp[i])||exp[i]=='.'){str=str+exp[i];}else if(exp[i]==' '){const char*p=str.c_str();digit=atof(p);//string转换为doublenumber.push(digit);str="";}else//(exp[i]!='.'&&exp[i]!=''&&!isdigit(exp[i])&&number.size()>=2){double result;double right;double left;right=number.top();number.pop();left=number.top();number.pop();switch(exp[i]){case'+':result=left+right;number.push(result);break;case'-':result=left-right;number.push(result);break;case'*':result=left*right;number.push(result);break;case'/':result=left/right;number.push(result);break;case'%':{int(result)=int(left)%int(right);number.push(result);b reak;}case'^':result=pow(left,right);number.push(result);break;}}}double finalresult=number.top();number.pop();return finalresult;}void main(){int x=1;cout<<"计算表达式"<<endl;cout<<"支持加+ 减- 乘* 除/ 整数取余% 次幂^ 小括号()"<<endl;while(x==1){string str;cout<<"请输入表达式,最后不加等号"<<endl;cin>>str;string exp;int a=examine(str);if(a==2){exp=transform(str);cout<<str<<"="<<calculate(exp)<<endl;}cout<<"继续运算请输入Y,否则按任意键退出"<<endl;char ch;cin>>ch;if(ch=='Y'||ch=='y'){x=1;}else{x=2;}}system("pause");}六、运行结果:这个是一开始运行的情况。
《数据结构与算法分析》课程设计报告课题名称:文本编辑器课题设计人(学号):刘佳玉*************指导教师:**评阅成绩:评阅意见:提交报告时间:20 13 年12 月22 日文本编辑器计算机科学与技术专业学生刘佳玉指导老师朱宏[摘要]文本编辑器(或称文字编辑器)是用作编写普通文字的应用软件,它与文档编辑器(或称文字处理器)不同之处在于它并非用作桌面排版(例如文档格式处理)。
它常用来编写程序的源代码。
专业的计算机用户使用的文本编辑器往往不限制打开文件的大小。
这样的编辑器在编辑大文件时,启动仍然很快,而且它们还能够编辑超过内存大小的文件。
而简单的文本编辑器通常直接把文件读至内存。
这样在处理较大文件时速度较慢,对于更大的文件,则干脆无法处理。
我所做的这个文本编辑器包含插入、移除、替换、查找、显示和新建的功能,是一种简单的文本编辑器。
关键词:简单的文本编辑器插入移除替换查找显示新建一、实验名称:文本编辑器二、实验的目的和要求:1.采用C++的ASCII码文件和串函数实现;2.熟练掌握串运算的应用;3.熟练掌握计算机系统的基本操作方法,了解如何编辑、编译、链接和运行一个C++程序;4.上机调试程序,掌握查错、排错使程序能正确运行。
三、实验的环境:指硬件和软件环境1.硬件环境:G405+4G内存+320G硬盘+川大校园网2.软件环环境:操作系统:Windows 7编译系统的版本的特点:Dev-C++是一套用于开发C/C++的自由的集成开发环境(IDE),并以GPL作为散布许可。
使用MinGW及GDB作为编译系统与除错系统。
Dev-C++的IDE是利用Delphi开发的。
编辑软件特点:包含强大的类和内嵌WinAPI的MFC,具有可视化的编程界面。
四、算法描述:1、用户可以选择自己输入文本或者直接使用程序以初始化的文本,用switch case语句就可以根据用户不同的选择执行相应的代码。
相应代码:cout<<"a代表自己输入文本,b代表使用电脑设置的文本"<<endl; cout<<"请输入你的选择:"<<endl;char ch;cin>>ch;switch(ch)//对用户的不同选择执行不同的代码{case 'a'://当用户选择自行输入文本时······break;case 'b'://当用户选择使用电脑设置的文本时·····break;}2、当用户选择自己输入文本时,就需要写一些函数来存储这些信息,可以将这些函数封装在一个模板类中,只要定义一个之歌类的对象(bianji)就可以在需要的时候调用类的函数。
在这个时候需要调用的函数有:bianji.Sethang(h);//设置文本的行数bianji.Setlie(l);//设置文本的列数bianji.Setwenben();//输入文本bianji.Showwenben();//显示文本3、单用户选择使用程序初始化的文本时,只要显示文本即可。
这个时候需要的函数有:bianji.Showwenben();//显示文本4、该文本编辑器有插入,移除,替换,查找,显示和重置的功能,通过输出语句告知用户文本编辑器的功能,并询问用户要使用哪个功能。
相应代码:char ch='s';//初始化chwhile(ch!='q')//当ch!='q'时,就不会退出循环{cout<<"i代表插入文本 ";cout<<"R代表移除文本 ";cout<<"r代表替换文本 ";cout<<"f代表查找文本 ";cout<<"s代表显示当前文本 ";cout<<"n代表重新建立一个文本 ";cout<<"q代表退出 "<<endl;cout<<"请输入你的选择:";cin>>ch;······}5、当用户选择插入(insert)功能时,就只需要将当前行数加1,将要插入的行及其后面的行的文本往后移一行,在输入要插入的行的文本即可,相应代码:while(h0>bianji.Gethang()||h0<1)//如果要插入的行大于已有的//最大行或者小于第一行就会要求重新输入一个{cout<<"输入错误,请重输:";cin>>h0;}bianji.Sethang(bianji.Gethang()+1);//当前行数加1int i,j;for(i=bianji.Gethang()-1;i>=h0;i--)//把要插入行及后面的行的//文本往后一次移一行{for(j=0;j<bianji.Getlie();j++){bianji.Xiugaiwenben(i,j,i-1,j);}}for(i=0;i<bianji.Getlie();i++)//输入要插入的那一行的文本{cout<<"请输入第"<<h0<<"行第"<<i+1<<"个字符:";bianji.Fuzhiwenben(h0-1,i);cout<<endl;}bianji.Showwenben();//显示文本6、当用户选择移除(remove)功能时,只需要将要移除的行的后面的文本依次往前移一行,就会顺便把要移除行的文本覆盖了,相当于达到了移除的效果,相应代码:while(h1>bianji.Gethang()||h1<1)//如果要移除的行大于已有的//最大行或者小于第一行就会要求重新输入一个{cout<<"输入有误,请重输:";cin>>h1;}bianji.Sethang(bianji.Gethang()-1);//将当前行数减1int i1,j1;for(i1=h1-1;i1<bianji.Gethang();i1++)//把要移除的行的后面的//行一次往前移一行就顺便把要移除的那一行给覆盖{ //了,从而达到移除的效果for(j1=0;j1<bianji.Getlie();j1++){bianji.Xiugaiwenben(i1,j1,i1+1,j1);}}bianji.Showwenben();7、当用户选择替换(replace)功能时,只需要重新输入要替换行的文本即可,其他行的文本不变,相应代码:for(i2=0;i2<bianji.Getlie();i2++) //得到要替换的那一行的列//数,然后输入新的文本{cout<<"请输入第"<<h2<<"行第"<<i2+1<<"个字符:";bianji.Fuzhiwenben(h2-1,i2);cout<<endl;}bianji.Showwenben();8、当用户选择查找(find)功能时,只要用户输入相应列数的文本,然后将其与每一行的文本进行比较,如果完全相同,则会输出相应的行号,通过循环语句来进行匹配,相应代码:for(i3=0;i3<bianji.Getlie();i3++)//根据当前文本的列数来输入//要查找的文本{cout<<"请输入第"<<i3+1<<"列的字符:";bianji.Fuzhiwenben(bianji.Gethang(),i3);//将输入的文本放//到当前的最后一行,只是暂时的} //在这个功能完了后就会//消失,因为没有改变文本的行列for(i3=0;i3<bianji.Gethang();i3++)//根据输入的文本,一行一行//的搜,将每一行的文本域输入的文本进行匹配{ //如果匹配成功就会输出相应的行数j3=0;while(bianji.Findwenben(i3,j3)==bianji.Findwenben(bianji.Gethang(),j3)&&j3<bianji.Getlie()){j3++;//相同就会在查下一列的字符是否相同,直到这一完// 了}if(j3==bianji.Getlie()){cout<<"你要找的文本在第"<<i3+1<<"行"<<endl;count+=1;}}if(count==0){cout<<"你要找的文本不在现有文本中"<<endl;}cout<<endl;9、当用户选择显示(show)功能时,只需要调用模板类中的显示函数即可,相应代码:bianji.Showwenben();与初始化的部分相同,也只是要调用模板类中的相应函数即可,相应代码:cout<<"请输入新的行数:";cin>>h4;bianji.Sethang(h4);//新行cout<<"请输入新的列数:";cin>>l4;bianji.Setlie(l4);//新列bianji.Setwenben();//新文本bianji.Showwenben();//显示文本10、当用户选择重置(new)功能时,五、源程序清单:该程序代码分为3部分,分别是:1、模板类的代码,文件名“linklist.h”,相应代码:#ifndef LINKLIST_H_#define LINKLIST_H_#include<iostream>using namespace std;template<class ElemType>//队列的模板类class LinkList{private:ElemType wenben[256][256];//创立一个二维数组作为存储文本的空间int hang;//数组的行int lie;//数组的列public:LinkList()//构造函数{hang=1;//初始化行数为1lie=1;//初始化列数为1wenben[0][0]='a';//初始化文本为'a'}~LinkList(){}//析构函数void Xiugaiwenben(int h1,int l1,int h2,int l2)//修改文本,将文本中h2行l2列的{ //字符赋给h1行l1列wenben[h1][l1]=wenben[h2][l2];}void Fuzhiwenben(int h,int l)//给文本中h行l列赋一个字符{cin>>wenben[h][l];}ElemType Findwenben(int h,int l)//返回h行l列的字符{return wenben[h][l];}void Sethang(int h)//设定数组的行数{hang=h;}int Gethang()//得到数组的行数{return hang;}void Setlie(int l)//设定数组的列数{lie=l;}int Getlie()//得到数组的列数{return lie;}void Setwenben()//设立一个文本{int i,j;for(i=0;i<hang;i++){cout<<"请输入第"<<i+1<<"行的文本:"<<endl;for(j=0;j<lie;j++){cout<<"请输入第"<<i+1<<"行第"<<j+1<<"列的字符"<<endl;cin>>wenben[i][j];}}}void Showwenben()//显示当前文本{cout<<"当前文本是:"<<endl;int i,j;for(i=0;i<hang;i++){for(j=0;j<lie;j++){cout<<wenben[i][j];}cout<<endl;}}};#endif2、编辑类的代码,文件名是“editor.h”,相应代码:#include"linklist.h"class Editor{private:LinkList<char>bianji;//模板类的char型对象,用来调用模板类中的函数int count;//在使用查找功能时用来判断是否要查找的文本在当前文本中public:void Chushihua()//设置文本的函数{cout<<"a代表自己输入文本,b代表使用电脑设置的文本"<<endl;cout<<"请输入你的选择:"<<endl;char ch;cin>>ch;switch(ch)//对用户的不同选择执行不同的代码{case 'a'://当用户选择自行输入文本时cout<<"请输入文本的行数:";int h;cin>>h;cout<<endl;cout<<"请输入文本的列数:";int l;cin>>l;bianji.Sethang(h);//设置文本的行数bianji.Setlie(l);//设置文本的列数bianji.Setwenben();//输入文本bianji.Showwenben();//显示文本break;case 'b'://当用户选择使用电脑设置的文本时bianji.Showwenben();//显示初始化的文本break;}}void Edite()//编辑文本的函数{char ch='s';//初始化chwhile(ch!='q')//当ch!='q'时,就不会退出循环{cout<<"i代表插入文本";cout<<"R代表移除文本";cout<<"r代表替换文本";cout<<"f代表查找文本";cout<<"s代表显示当前文本";cout<<"n代表重新建立一个文本";cout<<"q代表退出"<<endl;cout<<"请输入你的选择:";cin>>ch;switch(ch)//根据用户的不同选择执行不同的代码{case 'i'://选择插入(insert)功能bianji.Showwenben();//显示当前文本cout<<"请问要插入到第几行?:";int h0;cin>>h0;while(h0>bianji.Gethang()||h0<1)//如果要插入的行大于已有的最大行或者小于第一行就会要求重新输入一个{cout<<"输入错误,请重输:";cin>>h0;}bianji.Sethang(bianji.Gethang()+1);//当前行数加1int i,j;for(i=bianji.Gethang()-1;i>=h0;i--)//把要插入行及后面的行的文本往后一次移一行{for(j=0;j<bianji.Getlie();j++){bianji.Xiugaiwenben(i,j,i-1,j);}}for(i=0;i<bianji.Getlie();i++)//输入要插入的那一行的文本{cout<<"请输入第"<<h0<<"行第"<<i+1<<"个字符:";bianji.Fuzhiwenben(h0-1,i);cout<<endl;}bianji.Showwenben();//显示文本break;case 'R'://选择移除(remove)功能bianji.Showwenben();cout<<"请问要移除哪一行?:";int h1;cin>>h1;while(h1>bianji.Gethang()||h1<1)//如果要移除的行大于已有的最大行或者小于第一行就会要求重新输入一个{cout<<"输入有误,请重输:";cin>>h1;}bianji.Sethang(bianji.Gethang()-1);//将当前行数减1int i1,j1;for(i1=h1-1;i1<bianji.Gethang();i1++)//把要移除的行的后面的行一次往前移一行就顺便把要移除的那一行给覆盖{ //了,从而达到移除的效果for(j1=0;j1<bianji.Getlie();j1++){bianji.Xiugaiwenben(i1,j1,i1+1,j1);}}bianji.Showwenben();break;case 'r'://选择替换(replace)功能bianji.Showwenben();cout<<"要替换哪一行?:";int h2;cin>>h2;int i2;for(i2=0;i2<bianji.Getlie();i2++)//得到要替换的那一行的列数,然后输入新的文本{cout<<"请输入第"<<h2<<"行第"<<i2+1<<"个字符:";bianji.Fuzhiwenben(h2-1,i2);cout<<endl;}bianji.Showwenben();break;case 'f'://选择查找(find)功能bianji.Showwenben();cout<<"请输入要查找的文件:"<<endl;int i3,j3;count=0;for(i3=0;i3<bianji.Getlie();i3++)//根据当前文本的列数来输入要查找的文本{cout<<"请输入第"<<i3+1<<"列的字符:";bianji.Fuzhiwenben(bianji.Gethang(),i3);//将输入的文本放到当前的最后一行,只是暂时的} //在这个功能完了后就会消失,因为没有改变文本的行列/*cout<<"第"<<h3<<"行的文本是:"<<endl;//输入行数就会将当前文本中那一行的文本输出for(i3=0;i3<bianji.Getlie();i3++){cout<<bianji.Findwenben(h3-1,i3);}*/for(i3=0;i3<bianji.Gethang();i3++)//根据输入的文本,一行一行的搜,将每一行的文本域输入的文本进行匹配{ //如果匹配成功就会输出相应的行数j3=0;while(bianji.Findwenben(i3,j3)==bianji.Findwenben(bianji.Gethang() ,j3)&&j3<bianji.Getlie()){j3++;//相同就会在查下一列的字符是否相同,直到这一行完了}if(j3==bianji.Getlie()){cout<<"你要找的文本在第"<<i3+1<<"行"<<endl;count+=1;}}if(count==0){cout<<"你要找的文本不在现有文本中"<<endl;}cout<<endl;break;case 's'://选择显示当前文本bianji.Showwenben();break;case 'n'://选择重置(new)功能int h4,l4;cout<<"请输入新的行数:";cin>>h4;bianji.Sethang(h4);//新行cout<<"请输入新的列数:";cin>>l4;bianji.Setlie(l4);//新列bianji.Setwenben();//新文本bianji.Showwenben();//显示文本break;case 'q':break;}}}};3、主函数的代码,文件名是“main.cpp”,相应代码:#include"linklist.h"#include"editor.h"int main(){Editor e;//编辑类的对象,用来调用类中的函数e.Chushihua();//调用设置文本的函数e.Edite();//调用编辑文本的函数return 0;}六、运行结果:1、选择自己输入文本(a),输入文本为(3行2列):qwerty进行插入操作(i),插入文本as到第2行:进行移除操作(R),移除第3行文本:进行替换操作(t),将第一行文本qw替换为df:进行查找操作(f),查找文本as和qw:进行显示操作(s):进行重置操作(n):重置操作和自己输入文本是一样的,在这里就不演示了,有兴趣可以自己尝试。