数据结构与算法设计实验
实验报告

实验报告课题名称:数据结构与算法班级:09网络工程姓名:杨益良学号:2009181105指导老师:梁海丽实验一:线性表的顺序存储一、实验目的1.掌握用C语言调试程序的基本方法。
2.掌握线性表顺序存储的基本运算,如插入、删除等。
二、实验内容线性表在顺序存储结构上的插入元素,删除元素运算三、实验要求1.C++/C完成算法设计和程序设计并上机调试通过。
2.撰写实验报告,提供实验结果和数据。
3.分析算法,要求给出具体的算法分析结果,并简要给出算法设计小结和心得。
四、源程序#include<stdio.h>#define MAXSIZE 100int list[MAXSIZE];int n;/*insert in a seqlist*/int sq_insert(int list[], int *p_n, int i, int x){int j;if (i<0 || i>*p_n) return(1);if (*p_n==MAXSIZE) return(2);for (j=*p_n+1; j>i; j--)list[j]=list[j-1];list[i]=x;(*p_n)++;return(0);}/*delete in a seq list*/int sq_delete(int list[], int *p_n, int i){int j;if (i<0 || i>=*p_n) return(1);for (j = i+1; j<=*p_n; j++)list[j-1] = list[j];(*p_n)--;return(0);}void main(){int i,x,temp;printf("please input the number for n\n");printf("n=");scanf("%d",&n);for (i=0; i<=n; i++){printf("list[%d]=",i);scanf("%d",&list[i]);}printf("The list before insertion is\n");for (i=0; i<=n; i++) printf("%d ",list[i]);printf("\n");printf("please input the position where you want to insert a value\nposition=");scanf("%d",&i);printf("please input the value you want to insert.\nx=");scanf("%d",&x);temp=sq_insert(list,&n,i,x);switch(temp){case 0:printf("The insertion is successful!\n");printf("The list is after insertion is\n");for(i=0; i<=n; i++) printf("%d ",list[i]);printf("\n");printf("%d\n",n);break;case 1:case 2:printf("The insertion is not successful!\n");break;}/*deleting*/printf("The list before deleting is\n");for (i=0; i<=n; i++) printf("%d ",list[i]);printf("\n");printf("please input the position where you want to delete a value\nposition=");scanf("%d",&i);temp=sq_delete(list,&n,i);switch(temp){case 0:printf("The deleting is successful!\n");printf("The list is after deleting is\n");for(i=0; i<=n; i++) printf("%d ",list[i]);printf("\n");printf("%d",n);break;case 1:printf("The deleting is not successful!");break;}}五、程序运行情况六、实验结果分析在顺序表中插入一个元素后,插入位置及之后的元素后移表长增长1;在顺序表中删除一个元素后,插入位置及之前的元素左移,表长减1;在该实验通过c语言调试程序了解并掌握了线性表在顺序存储结构上插入元素、删除元素的算法设计及相关程序设计和实现方法。
【数据结构算法】实验1 线性表应用-多项式计算(附源代码)

浙江大学城市学院实验报告课程名称数据结构与算法实验项目名称实验一线性表应用---多项式计算实验成绩指导老师(签名)日期一.实验目的和要求1.进一步掌握线性表的的基本操作。
2.掌握线性表的典型应用----多项式表示与计算。
二. 实验内容1.设用线性表( (a1, e1), (a2, e2), ……, (am, em) ) 表示多项式P(x) = a1*x e1 + a2*x e2+…+ am*x em,其中:a1~am为非零系数,0≤e1<e2<…..<em,请编写用链式存储结构(带表头附加结点的单链表)存储该多项式时,多项式基本操作的实现函数。
多项式基本操作应包括初始化多项式、清除多项式、输出多项式、插入一项、删除一项、多项式求值、多项式相加等。
要求:把多项式线性表的结构定义及多项式基本操作实现函数存放在头文件Linkpoly.h中,主函数存放在主文件test6_1.cpp中,在主函数中通过调用Linkpoly.h中的函数进行测试。
2.选做:编写用顺序存储结构存储多项式时,多项式基本操作的实现函数。
要求:把多项式线性表的结构定义及多项式基本操作实现函数存放在文件Seqpoly.h中,在主文件test6_1.cpp中增加测试语句对Seqpoly.h中的函数进行测试。
3.填写实验报告,实验报告文件取名为report1.doc。
4.上传实验报告文件report1.doc与源程序文件test6_1.cpp及Linkpoly.h、Seqpoly.h(若有)到Ftp服务器上自己的文件夹下。
三. 函数的功能说明及算法思路包括每个函数的功能说明,及一些重要函数的算法实现思路※注1:除了[多项式求值]与[多项式相加]两个函数外,线性表的基本操作函数,大部分沿用上学期[线性表的链式/顺序表示和实现]两个实验中的函数。
※注2:选作部分函数功能与思路与非选作部分基本一致,略去思路描述函数:void InitList(LNode *&H)功能:初始化单链表思路:使用附带头结点的方式初始化单链表函数:int LengthList (LNode *H)功能:求单链表长度思路:遍历整个单链表,设置变量记录并返回它的长度函数:bool EmptyList (LNode *H)功能:判断单链表是否为空表思路:判断头结点的后一结点是否为空,若空则为空表函数:void TraverseList(LNode *H)功能:遍历单链表思路:遍历整个单链表,输出所含所有元素函数:bool InsertList ( LNode *&H, ElemType item, int pos)功能:向单链表插入一个元素思路:创建新结点,根据pos的值来确定位置并向单链表中插入新元素。
数据结构实验指导书(新版)

《数据结构和算法》实验指导书实验及学时数分配序号实验名称学时数(小时)1 实验一线性表 42 实验二树和二叉树 23 实验三图 24 实验四查找 25 实验五内部排序 2合计12几点要求:一、上机前:认真预习相关实验内容,提前编写算法程序,上机时检查(未提前编写程序者,扣除平时成绩中实验相关分数)。
二、上机中:在Turbo C或VC6.0环境中,认真调试程序,记录调试过程中的问题、解决方法以及运行结果。
上机时签到;下机时验收签字。
三、下机后:按要求完成实验报告,并及时提交(实验后1周内)。
实验一线性表【实验目的】1、掌握用Turbo c上机调试线性表的基本方法;2、掌握线性表的基本操作,插入、删除、查找以及线性表合并等运算在顺序存储结构和链式存储结构上的运算;3、运用线性表解决线性结构问题。
【实验学时】4 学时【实验类型】设计型【实验内容】1、顺序表的插入、删除操作的实现;2、单链表的插入、删除操作的实现;3、两个线性表合并算法的实现。
(选做)【实验原理】1、当我们在线性表的顺序存储结构上的第i个位置上插入一个元素时,必须先将线性表中第i个元素之后的所有元素依次后移一个位置,以便腾出一个位置,再把新元素插入到该位置。
若是欲删除第i个元素时,也必须把第i个元素之后的所有元素前移一个位置;2、当我们在线性表的链式存储结构上的第i个位置上插入一个元素时,只需先确定第i个元素前一个元素位置,然后修改相应指针将新元素插入即可。
若是欲删除第i个元素时,也必须先确定第i个元素前一个元素位置,然后修改相应指针将该元素删除即可;3、详细原理请参考教材。
【实验步骤】一、用C语言编程实现建立一个顺序表,并在此表中插入一个元素和删除一个元素。
1、通过键盘读取元素建立线性表;(从键盘接受元素个数n以及n个整形数;按一定格式显示所建立的线性表)2、指定一个元素,在此元素之前插入一个新元素;(从键盘接受插入位置i,和要插入的元素值;实现插入;显示插入后的线性表)3、指定一个元素,删除此元素。
数据结构与算法实验报告

《数据结构与算法》综合实验报告系别:专业:学生姓名:指导教师: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。
数据结构课程设计——报告(样例)

《数据结构与算法》课程设计报告王婧、龚丹、宋毅编写题目:航空订票管理系统学期:秋班号:学号:姓名:成绩:哈尔滨华德学院电子与信息工程学院年月一、实训设计的目的与要求(注:正文为宋体,五号字,为单倍行距)(一)课程设计目的(不少于字).数据结构课程设计是综合运用数据结构课程中学到的几种典型数据结构,以及程序设计语言(语言),自行实现一个较为完整的应用系统。
.通过课程设计,自己通过系统分析、系统设计、编程调试,写实验报告等环节,进一步掌握应用系统设计的方法和步骤,灵活运用并深刻理解典型数据结构在软件开发中的应用。
.学会将知识应用于实际的方法,提高分析和解决问题的能力,增加综合能力。
具体的有:()熟练掌握链表存储结构及其建立过程和常用操作;()熟练掌握队列的建立过程和常用操作;()学会自己调试程序的方法并掌握一定的技巧。
(二)题目要求(不少于字).每条航线所涉及的信息有:终点站名、航班号、飞机号、飞机周日(星期几)、乘员定额、余票量、订定票的客户名单(包括姓名、订票量、舱位等级,或)以及等候替补的客户名单(包括姓名和所需数量)。
.系统能实现的操作和功能如下:()查询航线:根据客户提出的终点站名输出如下信息:航班号、飞机号、星期几飞行和余票额;()承办订票业务:根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若有余票,则为客户办理订票手续,输出座位号;若已满员或余票量少余订票额,则需重新询问客户要求。
若需要,可登记排队候补;()承办退票业务:根据客户提出的情况(日期、航班号),为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其它排队候补的客户。
二、实训环境配置系统三、设计正文.需求分析。
算法与数据结构实验报告

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、存储结构定义和基本操作尽可能用头文件实现。
大学数据结构与算法基础实验报告书(参考)

《数据结构与算法》实验报告班级:学生学号:学生姓名:学生电话:指导教师: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.实验报告的撰写认真、格式符合要求,没有抄袭行为。
教师签名:。
[数据结构与算法][课程设计计划][数学与计算机系][信计][本科]
![[数据结构与算法][课程设计计划][数学与计算机系][信计][本科]](https://img.taocdn.com/s3/m/7e2194a9f90f76c660371a4b.png)
《数据结构与算法》课程设计计划一、设计目的数据结构与算法课程设计是《数据结构与算法》课程教案必不可缺的一个重要环节,它可加深学生对该课程所学内容的进一步的理解与巩固,是将计算机课程与实际问题相联接的关键步骤。
通过课程设计,能够提高学生分析问题、解决问题,从而运用所学知识解决实际问题的能力,因而必须给予足够的重视。
二、课程设计任务7-8人为一个课题组,组长1人,要求每组任选2题,各组不得重复选题且需独立完成课题内容,课题组成员必须清楚课题总体设计,必须分有功能模块并独立完成所分模块程序的编写任务。
最终课题组长组织连调,所有成员必须参加。
三、课程设计内容:1.二叉树的中序、前序、后序的递归、非递归遍历算法,按层次遍历的非递归遍历算法的实现,应包含建树的实现。
=================================================================== 2.车厢调度假设停在铁路调度站入口处的车厢序列的编号一次为1,2,3,4。
设计一个程序,求出所有可能由此输出的长度为4的车厢序列。
=================================================================== 3.平衡二叉树的判定给定一个二叉树的先序遍历或后序遍历结果,判定其是否为平衡二叉树。
===========================================================================4.图的基本操作与实现设计要求:(1)自选存储结构,输入含n个顶点(用字符表示顶点)和e条边的图G(2)求每个顶点的度,输出结果;(3)指定任意顶点x为初始顶点,对图G作DFS遍历,输出DFS顶点序列(提示:使用一个栈实现DFS);(4)指定任意顶点x为初始顶点,对图G作BFS遍历,输出BFS顶点序列(提示:使用一个队列实现BFS);(5)输入顶点x,查找图G:若存在含x的顶点,则删除该结点及与之相关连的边,并作DFS遍历(执行操作3);否则输出信息“无x”;===========================================================================5.图的算法实现(1)读入图的信息,建立与其对应的邻接矩阵和邻接表;(2)实现Prim、Kruskal、Dijkstra序算法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构与算法设计》实验报告——实验二学院:自动化学院班级:学号::一、实验目的按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程序。
二、实验容简单计算器。
请按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程序。
要求:①从键盘输入一个完整的表达式,以回车作为表达式输入结束的标志。
②输入表达式中的数值均为大于等于零的整数。
中间的计算过程如果出现小数也只取整。
例如,输入:4+2*5= 输出:14输入:(4+2)*(2-10)= 输出:-48三、程序设计概要设计1、宏定义#define TRUE 1#define FALSE 0#define OK 1#define ERROR 02、基本函数:(1)void InitStack_char(SqStack *S) //char型栈初始化(2)void InitStack_int(sqStack *S) //int型栈初始化(3)void Push_char(SqStack *S,char ch) //char型元素进栈(4)void Push_int(sqStack *S,int num) //int型元素进栈(5)char GetTop_char(SqStack *S) //取char型栈顶元素(6)int GetTop_int(sqStack *S) //取int型栈顶元素(7)Status In(char c) //判断是否为运算符,若是运算符则返回,否则返回(8)char Precede(char a,char b) //判断两运算符的先后次序(9)Status Pop_char(SqStack *S,char &x) //char型栈出栈(10)Status Pop_int(sqStack *S,int &x) //int型栈出栈(11)int Operate(int a,char theta,int b) //计算a和b运算结果3、流程图详细设计数据类型typedef struct node //构造char型栈{char ch;struct node *next;}node;typedef struct{struct node *base;struct node *top;}SqStack;typedef struct lnode //构造int型栈{int num;struct lnode *next;}lnode;typedef struct{struct lnode *base;struct lnode *top;}sqStack;操作部分void InitStack_char(SqStack *S){S->base = (node *)malloc(sizeof(node));S->base->next=NULL;S->top = S->base;} //char型栈初始化void InitStack_int(sqStack *S){S->base = (lnode *)malloc(sizeof(lnode));S->base->next=NULL;S->top = S->base;} //int型栈初始化void Push_char(SqStack *S,char ch){node *p;p=(node*)malloc(sizeof(node));p->ch=ch;p->next=S->top;S->top=p;} //char型元素进栈Status Push_int(sqStack *S,int num){lnode *p;p=(lnode*)malloc(sizeof(lnode));p->num=num;p->next=S->top;S->top=p;return OK;} //int型元素进栈char GetTop_char(SqStack *S){return (S->top->ch);} //取char型栈顶元素int GetTop_int(sqStack *S){return (S->top->num);} //取int型栈顶元素Status Pop_char(SqStack *S,char &x){if(S->base == S->top)return ERROR;node *p;p=S->top;x=p->ch;S->top=p->next;free(p);return OK;} //char型栈出栈Status Pop_int(sqStack *S,int &x){if(S->base == S->top)return ERROR;lnode *p;p=S->top;x=p->num;S->top=p->next;free(p);return OK;} //int型栈出栈计算功能int Operate(int a,char theta,int b){int i,z = 1;switch(theta){case '+':z = (a + b);break;case '-':z = (a - b);break;case '*':z = (a * b);break;case '/':z = (a / b);break;case '^':for(i = 1;i<=b;i++)z = z*a;break;}return (z);} //计算a和b运算结果Status In(char c){if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='='||c=='^') return OK;elsereturn ERROR;} //判断是否为运算符char Precede(char a,char b){if(a=='+'||a=='-'){if(b=='+'||b=='-'||b==')'||b=='=')return '>';elsereturn '<';}if(a=='*'||a=='/'){if(b=='('||b=='^')return '<';elsereturn '>';}if(a=='('){if(b==')')return '=';elsereturn '<';}if(a==')'){if(b!='(')return '>';}if(a=='#'){if(b=='=')return '=';elsereturn '<';}if(a=='^')return ('>');} //判断两运算符的先后次序主函数int main() //主函数{char c,x,theta;int a,b,c1; //定义变量SqStack OPTR; //定义字符栈sqStack OPNR; //定义整型栈InitStack_char(&OPTR); //初始化InitStack_int(&OPNR); //初始化Push_char(&OPTR,'#'); //将字符型栈底设为#c = getchar(); //从键盘输入得到字符while(c!='='||GetTop_char(&OPTR)!='#') //判定是否执行循环if(!In(c)){c1 = 0;while(!In(c)){c1 = c1*10+c-'0';c = getchar();}Push_int(&OPNR,c1);} //当扫描字符不是运算符时,转化为整型数存入栈中else{switch(Precede(GetTop_char(&OPTR),c)) //判定运算符的优先关系{case '<':Push_char(&OPTR,c);c = getchar();break; //当前运算符优先级高,存入char栈case '=':Pop_char(&OPTR,c);c = getchar();break; //运算符次序相等,存入char栈case '>': //当前运算符优先级低Pop_char(&OPTR,theta);Pop_int(&OPNR,b);Pop_int(&OPNR,a);Push_int(&OPNR, Operate(a,theta,b));//计算运算结果,并存入int栈break; //继续循环}}printf("%d\n",GetTop_int(&OPNR)); //计算完成,取出int栈顶元素,并输出return 0;}四、程序调试分析编写程序的过程中遇到了很多的问题,最突出的两个问题就是整数和两位数的运算处理,一开始修改了主函数部分之后,原来可以执行一位数运算的程序出现了error,由于没有及时保存,并且之前的代码无法恢复,只得重新编写一次。
第二次编写理清思路之后,在课本和网上资料的辅助下,终于成功的编出了程序并且可以完美执行。
经验告诉了我在编程的时候一定要注意经常进行调试,只有学会调试才能处理好大程序的编写,否则极其容易出错。
五、用户使用说明1.运行程序,2.将整个表达式从键盘键入,以“=”结束,回车可得到结果。
六、程序运行结果(1)输入:(11+3)*5= 输出:70(2)输入:(31-13)/(9-3)= 输出:6七、程序清单#include<stdio.h>#include<stdlib.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0typedef int Status;typedef struct node //构造char型栈{char ch;struct node *next;}node;typedef struct{struct node *base;struct node *top;}SqStack;typedef struct lnode //构造int型栈{int num;struct lnode *next;}lnode;typedef struct{struct lnode *base;struct lnode *top;}sqStack;void InitStack_char(SqStack *S){S->base = (node *)malloc(sizeof(node));S->base->next=NULL;S->top = S->base;} //char型栈初始化void InitStack_int(sqStack *S){S->base = (lnode *)malloc(sizeof(lnode));S->base->next=NULL;S->top = S->base;} //int型栈初始化void Push_char(SqStack *S,char ch){node *p;p=(node*)malloc(sizeof(node));p->ch=ch;p->next=S->top;S->top=p;} //char型元素进栈Status Push_int(sqStack *S,int num){lnode *p;p=(lnode*)malloc(sizeof(lnode));p->num=num;p->next=S->top;S->top=p;return OK;} //int型元素进栈char GetTop_char(SqStack *S){return (S->top->ch);} //取char型栈顶元素int GetTop_int(sqStack *S){return (S->top->num);} //取int型栈顶元素Status Pop_char(SqStack *S,char &x){if(S->base == S->top)return ERROR;node *p;p=S->top;x=p->ch;S->top=p->next;free(p);return OK;} //char型栈出栈Status Pop_int(sqStack *S,int &x){if(S->base == S->top)return ERROR;lnode *p;p=S->top;x=p->num;S->top=p->next;free(p);return OK;} //int型栈出栈int Operate(int a,char theta,int b){int i,z = 1;switch(theta){case '+':z = (a + b);break;case '-':z = (a - b);break;case '*':z = (a * b);break;case '/':z = (a / b);break;case '^':for(i = 1;i<=b;i++)z = z*a;break;}return (z);} //计算a和b运算结果Status In(char c){if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='='||c=='^') return OK;elsereturn ERROR;} //判断是否为运算符char Precede(char a,char b){if(a=='+'||a=='-'){if(b=='+'||b=='-'||b==')'||b=='=')return '>';elsereturn '<';}if(a=='*'||a=='/'){if(b=='('||b=='^')return '<';elsereturn '>';}if(a=='('){if(b==')')return '=';elsereturn '<';}if(a==')'){if(b!='(')return '>';}if(a=='#'){if(b=='=')return '=';elsereturn '<';}if(a=='^')return ('>');} //判断两运算符的先后次序int main() //主函数{char c,x,theta;int a,b,c1; //定义变量SqStack OPTR; //定义字符栈sqStack OPNR; //定义整型栈InitStack_char(&OPTR); //初始化InitStack_int(&OPNR); //初始化Push_char(&OPTR,'#'); //将字符型栈底设为#c = getchar(); //从键盘输入得到字符while(c!='='||GetTop_char(&OPTR)!='#') //判定是否执行循环{if(!In(c)){c1 = 0;while(!In(c)){c1 = c1*10+c-'0';c = getchar();}Push_int(&OPNR,c1);} //当扫描字符不是运算符时,转化为整型数存入栈中else{switch(Precede(GetTop_char(&OPTR),c)) //判定运算符的优先关系{case '<':Push_char(&OPTR,c);c = getchar();break; //当前运算符优先级高,存入char栈case '=':Pop_char(&OPTR,c);c = getchar();break; //运算符次序相等,存入char栈case '>': //当前运算符优先级低Pop_char(&OPTR,theta);Pop_int(&OPNR,b);Pop_int(&OPNR,a);Push_int(&OPNR, Operate(a,theta,b));//计算运算结果,并存入int栈break; //继续循环}}}printf("%d\n",GetTop_int(&OPNR)); //计算完成,取出int栈顶元素,并输出return 0;}。