哈工大数据结构线性结构及其应用

合集下载

哈工大 数据结构 实验一 线性表的实验

哈工大 数据结构 实验一 线性表的实验
n.push(w*y);
}
else if(input[i]=='/'){
y=n.pop();w=n.pop();
n.push(w/y);
}
}
cout<<n.pop()<<endl;
}
int main(){
int i,j;
double a[64];
char input[512],o;
stack<char> s;
printf("do you want to try again?(Y/N) ");
o=getchar();
if(o=='n'||o=='N') break;
getchar();printf("\n");
}
printf("thanks for using it...\n");
}
stack<double> n;
while(true){
i=0;j=0;s.null();n.null();
printf("please input the expression: ");
change(i,j,a,input,s);
printf("the answer is: ");
compute(i,j,a,input,n);
哈尔滨工业大学计算机科学与技术学院
实验报告
课程名称:数据结构与算法
课程类型:必修
实验项目名称:线性表实验
实验题目:算术表达式求值
班级:0903201
学号:1090320110
姓名:王岳

第4章-哈工大-数据结构-图结构及其应用算法

第4章-哈工大-数据结构-图结构及其应用算法

第4章图结构及其应用算法数据结构与算法Data Structures andgAlgorithms张岩海量数据计算研究中心哈工大计算机科学与技术学院第4章图结构及其应用算法2016/11/20Slide 4-2——图论欧拉欧拉1707年出生在瑞士的巴塞尔城,19岁开始发表论文,直到76岁。

几乎每一个数学领域都可以表论文直到76岁几乎每个数学领域都可以看到欧拉的名字,从初等几何的欧拉线,多面体的欧拉定理,立体解析几何的欧拉变换公式,四次方程的欧拉解法到数论中的欧拉函数,微分方程的欧拉方程,级数论的欧拉常数,变分学的欧拉方程,复变函数的欧拉公式等等。

据统计他那不倦的一生,共写下了886本书籍和论文,其中分析、代数、数论占40%,几何占18%,物理和力学占28%,天文学占11%,弹道学、航海学、力学占28%天文学占11%弹道学航海学建筑学等占3%。

1733年,年仅26岁的欧拉担任了彼得堡科学院学教授年到林担任科了彼得堡科学院数学教授。

1741年到柏林担任科学院物理数学所所长,直到1766年,重回彼得堡,没有多久,完全失明。

欧拉在数学上的建树很多,对著名的哥尼斯堡七桥问题的解答开创了图论的研究。

哥尼斯堡七桥问题能否从某个地方出发,穿过所有的桥仅一次后再回到出发点?学习目标图结构是一种非线性结构,反映了数据对象之间的任意关系,在计算机科学、数学和工程中有着非常广泛的应用。

了解图的定义及相关的术语,掌握图的逻辑结构及其特点;了解图的存储方法,重点掌握图的邻接矩阵和邻接表存储结构;掌握图的遍历方法,重点掌握图的遍历算法的实现;了解图的应用,重点掌握最小生成树、双连通性、强连通性、最短路径、拓扑排序和关键路径算法的基本思想、算法原理和实现过程。

本章主要内容4.1 图的基本概念4.2 图的存储结构4.3 图的遍历(搜索)4.4 最小生成树算法4.5 双连通性算法4.5双连通性算法4.6 强连通性算法4.7最短路径算法4.7 最短路径算法4.8 拓扑排序算法4.9 关键路径算法本章小结本章的知识点结构基本的数据结构(ADT)图无向图有向图加权图网络图(无向图、有向图;加权图----网络)知识点结构定义及相关术语逻辑结构及其特征ADT定义A逻辑结构静态的结构基本操作(算法)存储结构(描述)ADT基本动态的操作存储结构特点存储结构的定义ADT实现数据结构存储结构静态的结构操作(算法)实现算法的性能应用:最小生成树最短路径拓扑排序和关键路径动态的操作,,图的搜索(遍历)算法是有关图问题的重要核心算法!4.1基本定义4.1定义1 图(Graph)图是由顶点(vertex)的有穷非空集合和顶点之间边(edge)的集合组成的一种数据结构,通常表示为:G = (V,E)其中:G表示一个图,V是图G中顶点的集合,E是图G中顶点之间边的集合。

哈工大-数据结构课件-严蔚敏《数据结构》(C语言版)

哈工大-数据结构课件-严蔚敏《数据结构》(C语言版)

④ 程序中指令重复执行的次数。
[定义] 语句频度:语句重复执行的次数
1.4 算法与算法分析
第1章 绪论
描述算法的书写规则
所有算法均以函数形式给出, 算法的输入数据来自参数表; 参数表的参数在算法之前均进行类型说明;
有关结点结构的类型定义,以及全局变量的说明等均在算法之
前进行说明
评价算法标准
关系;
1.3 抽象数据类型的表示与实现
第1章 绪论
抽象数据型的实现
抽象描述 →(高级语言)编写的程序
三条原则:
①符合规格描述的定义; ②有尽可能好的通用性; ③尽可能独立于程序的其它部分
多层次抽象技术
自底向上与自顶向下相结合、由简单到复杂
1.3 抽象数据类型的表示与实现
抽象数据类型的形式描述
1.2 基本概念和术语
第1章 绪论
算法:数据运算的描述
数据结构:数据的逻辑结构和存储结构
算法+数据结构=程序
1.1 数据结构及其讨论范畴 1.2 基本概念和术语 1.3 抽象数据类型的表示与实现 1.4 算法和算法分析
1.3 抽象数据类型的表示与实现
第1章 绪论
抽象数据型Abstract Data Types(ADT) [定义]:抽象数据型是一个数学模型和在该模型 上定义的操作的集合
1.1 数据结构及其讨论范畴
第1章 绪论
数据结构是一门讨论"描述现实世界实体的数 学模型(非数值计算)及其上的操作在计算机中如何 表示和实现"的学科。 ① 在解决问题时可能遇到的典型的逻辑结构 (数据结构) ② 逻辑结构的存储映象(存储实现) ③ 数据结构的相关操作及其实现。
1.1 数据结构及其讨论范畴 例

链表线性结构(多项式的加减乘除)

链表线性结构(多项式的加减乘除)

哈尔滨工业大学计算机科学与技术学院实验报告课程名称:数据结构与算法课程类型:必修实验项目:线性结构及其应用实验题目:多项式的加减乘除和特定值带入实验日期:2017/11/5班级:1603001学号:**********姓名:***一、实验目的设计线性表的链式存储结构,并实现一元多项式的代数运算。

二、实验要求及实验环境(1)实验要求:以链表存储一元多项式,在此基础上完成对多项式的代数操作。

1.能够输入多项式(可以按各项的任意输入顺序,建立按指数降幂排列的多项式)和输出多项式(按指数降幂排列),以文件形式输入和输出,并显示。

2.能够计算多项式在某一点 x=x0 的值,其中 x0 是一个浮点型常量,返回结果为浮点数。

3.能够给出计算两个多项式加法、减法、乘法和除法运算的结果多项式,除法运算的结果包括商多项式和余数多项式。

4.要求尽量减少乘法和除法运算中间结果的空间占用和结点频繁的分配与回收操作。

(提示:利用循环链表结构和可用空间表的思想,把循环链表表示的多项式返还给可用空间表,从而解决上述问题)。

(2)实验环境:windows下的CB;三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系)1.逻辑设计:struct polynode{int coef;int exp;struct polynode * link;};//建立链表typedef struct polynode poly;poly* Attch(int c,int e,poly *d);//多项式插入poly *newPoly();//新链表poly *padd(poly *p1,poly *p2);//多项式加法poly *pmul(poly *p1,poly *p2);//乘法poly *inputPoly();//输入多项式poly *psub(poly *p1,poly *p2);//减poly *pdiv(poly *p1,poly *p2);//除poly *inputPoly1();double caculate(double x,poly *p);//计算多项式void sortPoly(poly *p);//多项式排序void outputPoly(poly*p);//输出多项式void delPoly(poly*p);//清空多项式2.物理设计:四、测试结果五、经验体会与不足不能连续输入多个多项式函数设计不够简洁算法过于直接简单加注释后修改代码方便六、附录:源代码(带注释)#include <stdio.h>#include <stdlib.h>struct polynode{int coef;int exp;struct polynode * link;};//建立新链表typedef struct polynode poly;poly* Attch(int c,int e,poly *d);//插入链表poly *newPoly();//建立新链表poly *padd(poly *p1,poly *p2);//加法poly *pmul(poly *p1,poly *p2);//乘法poly *inputPoly();//输入多项式poly *psub(poly *p1,poly *p2);//减法poly *pdiv(poly *p1,poly *p2);//除法poly *inputPoly1();//输入double caculate(double x,poly *p);//计算void sortPoly(poly *p);//排序void outputPoly(poly*p);//输出多项式void delPoly(poly*p);//除法void Insert(poly *p,poly *h){if(p->coef==0)free(p);else{poly *q1,*q2;q1=h;q2=h->link;while(q2&&p->exp<q2->exp){q1=q2;q2=q2->link;}/*判断两个指数是否相等*/if(q2&&p->exp==q2->exp){q2->coef+=p->coef;free(p);if(!q2->coef){q1->link=q2->link;free(q2);}}/*相等就加系数*/else{p->link=q2;q1->link=p;}}/*不等就插在后面*/}int main(){poly *p1,*p2,*padd1,*psub1,*pmul1; p1=newPoly();printf("第一个多项式\n");p1->link=inputPoly();outputPoly(p1);p2=newPoly();printf("第二个多项式\n");p2->link=inputPoly1();outputPoly(p2);padd1=newPoly();pmul1=newPoly();psub1=newPoly();padd1->link=padd(p1,p2);printf("padd\n");outputPoly(padd1);psub1->link=psub(p1,p2);printf("psub\n");outputPoly(psub1);pmul1->link=pmul(p1,p2);printf("pmul\n");outputPoly(pmul1);printf("输入x的值!");int x;scanf("%d",&x);x=caculate(x,p1);printf("%d\n",x);pdiv(p1,p2);return 0;}poly *newPoly(){poly *x;x=(poly*)malloc(sizeof(poly)); x->link=NULL;x->coef=0;x->exp=0;return x;}poly* Attch(int c,int e,poly *d) {poly *x;x=newPoly();x->coef=c;x->exp=e;d->link=x;return x;}poly *padd(poly *p1,poly *p2){poly *a, *b,*c,*d,*p;c=newPoly();d=c;p=c;a=p1->link;b=p2->link;while(a!=NULL&&b!=NULL){if(a->exp>b->exp)//如果a的系数大于b把a先输入 {c=Attch(a->coef,a->exp,c);a=a->link;}else if(a->exp<b->exp)//小于相反{c=Attch(b->coef,b->exp,c);b=b->link;}else//相等{c=Attch(b->coef+a->coef,a->exp,c);a=a->link;b=b->link;}}/*a b比较完成开始遍历剩下的未插入的*/while(a!=NULL){c=Attch(a->coef,a->exp,c);a=a->link;}while(b!=NULL){c=Attch(b->coef,b->exp,c);b=b->link;}c->link=NULL;d=d->link;p->link=NULL;delPoly(p);return d;}poly *psub(poly*p1,poly*p2)//加和减思路相同,b的系数得输入相反值{poly *a, *b,*c,*d,*p;c=newPoly();d=c;p=c;a=p1->link;b=p2->link;while(a!=NULL&&b!=NULL){if(a->exp>b->exp){c=Attch(a->coef,a->exp,c);a=a->link;}else if(a->exp<b->exp){c=Attch(b->coef*(-1),b->exp,c);b=b->link;}else{if((a->coef-b->coef)>0){c=Attch(a->coef-b->coef,a->exp,c); a=a->link;b=b->link;}else{a=a->link;b=b->link;}}}while(a!=NULL){c=Attch(a->coef,a->exp,c);a=a->link;}while(b!=NULL){c=Attch(b->coef*(-1),b->exp,c);b=b->link;}c->link=NULL;d=d->link;p->link=NULL;delPoly(p);return d;}/*乘法,先用第一个链表的第一个数据乘以第二个链表里的所有值,储存在新的链表中,之后遍历一中所有的值,最后把这些多项式加在一起。

数据结构简介及常见应用领域

数据结构简介及常见应用领域

数据结构简介及常见应用领域数据结构是计算机科学中非常重要的一个概念,它关注的是如何组织和存储数据,以便高效地访问和修改。

合理选择和使用数据结构对于解决复杂的计算问题至关重要。

本文将介绍数据结构的基本概念,以及它在常见应用领域中的应用。

一、数据结构的基本概念1. 线性结构线性结构是最简单、最常用的一种数据结构,它的特点是数据元素之间存在一对一的关系。

常见的线性结构有数组、链表、栈和队列等。

2. 非线性结构非线性结构是指数据元素之间存在一对多或多对多的关系,常见的非线性结构有树和图等。

树和图可以用于描述具有层次关系或者网络关系的数据。

3. 数据的存储方式数据的存储方式有两种常见形式,即顺序存储和链式存储。

顺序存储指的是将数据元素连续存储在一块内存中,通过下标来访问元素;链式存储则是通过指针将数据元素存储在不同的物理块中,通过指针链接实现数据的访问。

4. 基本操作数据结构的基本操作包括插入、删除、查找和修改等。

根据不同的数据结构,这些操作的实现方式也各有不同。

二、数据结构的应用领域1. 数据库管理系统数据库管理系统是现代信息系统的核心组成部分,而数据结构在数据库的实现和管理中起到重要的作用。

数据库采用了各种数据结构来组织和存储数据,如哈希表、B树、B+树等。

这些数据结构可以提高数据库的查询效率,保证数据的完整性和一致性。

2. 图形图像处理在图形图像处理中,常常需要对图像进行各种操作,如旋转、缩放和裁剪等。

数据结构中的图结构非常适合描述图像的关系和属性,通过合理选择和使用数据结构,可以高效地实现对图像的处理和分析。

3. 网络通信网络通信是现代社会的重要组成部分,数据结构在网络通信中发挥着关键作用。

例如,在路由器中使用了路由表和转发表等数据结构,通过这些数据结构可以快速确定数据的传输路径,提高网络的传输效率。

4. 编译器设计编译器是将高级语言翻译为机器语言的系统软件,它包含了词法分析、语法分析、语义分析和代码生成等过程。

哈尔滨理工大学数据结构实验报告线性表

哈尔滨理工大学数据结构实验报告线性表

课程名称:数据结构实验项目:线性表姓名:zhangsan专业:网络工程班级:09-1班00000 10000计算机科学与技术学院实验教学中心20 11年 5 月17 日实验项目名称:线性表(学时)一、实验目的了解顺序表的结构特点及有关概念,掌握顺序表建立、插入、删除的基本操作算法。

2.了解单链表的结构特点及有关概念,掌握单链表建立、插入、删除的基本操作算法。

二、实验内容1.顺序表的实践。

1)建立4个元素的顺序表list[]={2,3,4,5},实现顺序表建立的基本操作。

2)在list[]={2,3,4,5}的元素4和5之间插入一个元素9,实现顺序表插入的基本操作。

3)在list[]={2,3,4,9,5}中删除指定位置(i=3)上的元素9,实现顺序表的删除的基本操作。

2.单链表的实践。

1)建立一个包括头结点和3个结点的(4,2,1)的单链表,实现单链表建立的基本操作。

2)在已建好的单链表中的指定位置(x=2)插入一个结点3,实现单链表插入的基本操作。

3)在一个包括头结点和4个结点的(4,2,3,1)的单链表的指定位置删除一个结点,实现单链表删除的基本操作。

三、实验步骤线性表(linear list)是n(n≥0)个数据元素a1,a2,…an组成的有限序列。

其中n 称为数据元素的个数或线性表的长度,当n=0时称为空表,n>0时称为非空表。

通常将非空的线性表记为(a1,a2,…,an),其中的数据元素ai(1≤i ≤n)是一个抽象的符号, ai是第i个数据元素,称i为数据元素ai在线性表中的位置。

其具体含义在不同情况下是不同的,即它的数据类型可以根据具体情况而定,本书中,我们将它的类型设定为elemtype,表示某一种具体的已知数据类型。

顺序表也称为线性表的顺序存储结构。

其存储方式为:在内存中用一组地址连续的存储单元依次存储线性表的数据元素,但该连续存储空间的大小要大于或等于顺序表的长度。

一般让线性表中第一个元素存放在连续存储空间第一个位置,第二个元素紧跟着第一个之后,其余依此类推。

线性结构的特点线性结构的例子线性结构的应用

线性结构的特点线性结构的例子线性结构的应用
• 双链表
• 双向循环链表
空链表
• 仅有头结点,线性表中的结点都不存在。
• 结点插入操作分析
插入新结点前:
插入新结点后:
插入操作的关键语句
Tmp = new ListNode; Tmp->Element = x; Tmp->Next = Current->Next; Current->Next = Tmp;
2.2 线性表的顺序存储结构
• 线性表中结点存放在存储器上 一块连续的空间中。
• 借助存储空间的连续性,结点 可以按照其逻辑顺序依次存放。
• 逻辑相邻 物理相邻
顺序存储
顺序存储物理存储位置的计算
设第一个结点的存储地址为 LOC(a0), 余类推。设每个结
点占用 L 个单元。则:
a0
LOC(ai) = LOC(ai-1) + L
插入操作时间主要由元素移动来决定, 注意!由后向前的移动次序
线性表的顺序存储插入算法
template <class ElemType> int SeqList<ElemType>::Insert (int i, const ElemType & e) {//在位置i上插入一个值为e的结点,成功返回1。 Exception( ( i < 1) || ( i > length+1 ), ”i is not correct .”);
1. j←n 2. while (x≠A[j]) 3. j←j-1 4. end while 5. if x=A[j] then return j else return 0
查找操作的时间代价分析:
等概率下只考虑查找成功的情况 每个结点被查找的概率相同=(1/n)。 查找成功时的平均比较次数是:

数据结构之线性结构和非线性结构

数据结构之线性结构和非线性结构

数据结构之线性结构和非线性结构在计算机科学的世界里,数据结构就像是建筑物的架构,为数据的存储和操作提供了基础。

其中,线性结构和非线性结构是两种重要的分类。

线性结构,顾名思义,数据元素之间存在着一种线性的关系。

就好像是排成一列的士兵,一个接一个,顺序明确。

常见的线性结构有数组、链表和栈、队列等。

数组是一种最简单也是最常见的线性结构。

想象一下,它就像是一排整齐的盒子,每个盒子都有一个固定的位置,通过索引就能快速找到对应的元素。

数组的优点是访问元素速度快,只要知道索引,就能瞬间获取对应的值。

但它也有缺点,比如插入和删除元素比较麻烦,因为要移动大量的元素来腾出或填补位置。

链表则与数组不同。

它就像是一串珠子,每个珠子(节点)不仅包含数据,还包含指向下一个节点的链接。

链表在插入和删除元素时非常方便,只需要修改相邻节点的链接就行,无需大量移动元素。

但链表的访问速度相对较慢,要找到特定的元素,需要从头节点开始逐个遍历。

栈是一种特殊的线性结构,它遵循着“后进先出”的原则。

可以把栈想象成一个只有一个开口的桶,最后放进去的东西会最先被拿出来。

在程序中,函数调用的栈帧就是用栈来实现的。

队列则是“先进先出”,就像排队买票,先来的先买到票离开。

在计算机中,打印任务的排队、消息的传递等都可以用队列来实现。

说完线性结构,再来看非线性结构。

非线性结构的数据元素之间不是简单的线性关系,而是更为复杂的网状或层次关系。

树就是一种典型的非线性结构。

比如二叉树,每个节点最多有两个子节点。

二叉查找树在查找、插入和删除操作上都有很高的效率。

还有平衡二叉树、红黑树等,它们通过一些规则保持树的平衡,进一步提高了操作性能。

图则是更加复杂的非线性结构。

它由顶点和边组成,可以表示各种复杂的关系。

比如社交网络中人与人的关系、地图中城市之间的道路连接等。

线性结构和非线性结构在实际应用中各有其优势。

在选择使用哪种数据结构时,需要根据具体的需求来决定。

如果需要频繁地随机访问元素,数组可能是更好的选择;如果需要频繁地插入和删除元素,链表可能更合适。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

哈尔滨工业大学计算机科学与技术学院实验报告课程名称:数据结构课程类型:必修实验项目名称:线性结构及其应用实验题目:线性结构及其应用一、实验目的二、实验要求及实验环境三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系)1.逻辑设计2.物理设计四、测试结果五、系统不足与经验体会六、附录:源代码(带注释)一、实验目的输入中缀表达式保存并显示,之后转换为后缀表达式,并且求出表达式的结果。

二、实验要求及实验环境实验要求(1)从键盘输入任意一个语法正确的(中缀)表达式,显示并保存该表达式。

(2)利用栈结构,把上述(中缀)表达式转换成后缀表达式,并显示栈的状态变化过程和所得到的后缀表达式。

(3)利用栈结构,对上述后缀表达式进行求值,并显示栈的状态变化过程和最终结果。

实验环境Dev-C++软件中运行Win7系统三、设计思想本实验中定义了int 型,char型,struct 型,char *型,struct型逻辑设计:应用栈后进先出的规律,在转换为后缀表达式时,将操作运算符压入栈中,碰见更高级运算符时栈中元素出栈,继续比较;否则压栈。

这样可以完成表达式的转换。

在利用得到的后缀表达式计算结果时,将操作数压栈,遇见符号直接计算,这是后缀表达式的特点。

物理设计:建立一个结构体数组的栈,数组中存放运算符。

数组的添加和减少都在数组末尾元素进行。

可以视为一个栈。

四、测试结果样例1. 输入1+2*(3-4/2)输出为1+2*(3-4/2) ->此为保存并输出的中缀表达式12342/-*+ ->此为输出后缀表达式3 ->此为表达式的值样例2. 输入1+2*3/4-5输出为1+2*3/4-5123*4/+5--3五、系统不足与经验体会不足1.此程序只能进行整形一位数上的计算,无法实现实数范围内的计算。

2.程序用的是结构体数组来表示栈的存储结构,数组定义时,定义一段很大的空间,导致空间利用率不高。

经验体会1.建立算法框架时如中缀表达式变后缀表达式,后缀表达式的求值时,需要用到很多的函数来搭建。

这个可以先放下,先将该算法编好,完成之后再将所需要的函数填补起来。

这样可以简化步骤。

2.算法分模块解决,不把所有算法堆到一个函数里面。

这样可以使程序简洁明了,各个函数的分工明确。

易于调试差错。

六、附录:源代码(带注释)#include<stdio.h>#include<stdlib.h>#define MAX 100 //定义栈中最多有100个元素/*创建结构体,结构体中含有两个量,一个数组栈,一个指向栈顶元素*/ typedef struct{int data[MAX]; //定义数组栈int top; //栈顶标号}seqstack,*pseqstack;/*创建一个顺序栈,入口无参数,返回一个指向顺序栈的指针*/pseqstack init_seqstack(){pseqstack s;s=(pseqstack)malloc(sizeof(seqstack)); //申请栈的内存空间 if(s)s->top=-1; //创建新栈时栈顶指针指向-1return s;}/*判断栈是否为空,返回1表示空,0表示非空*/int empty_seqstack(pseqstack s){if(s->top==-1) //判断条件为top指针是否指向-1return 1;elsereturn 0;}/*入栈:栈顶插入x*/int push_seqstack(pseqstack s,int x){if(s->top==MAX-1)return 0; //栈已满,返回0else{s->top++; //栈顶指针+1,指向将要压栈的xs->data[s->top]=x;return 1;}}/*出栈:入口参数为s,*x。

删除栈顶元素,并且保存在*x中*/int pop_seqstack(pseqstack s,char *x)if(empty_seqstack(s))return 0;else{*x=s->data[s->top];s->top--;return 1;}}/*销毁栈*/void destroy_seqstack(pseqstack *s){if(*s)free(*s);*s=NULL;}/*判断字符是否为操作数;是返回1,否则为0*/int isnum(char c){if(c>='0'&&c<='9')return 1; //若字符常量的值小于等于‘9’大于等于‘0’则为操作数,并返回1 elsereturn 0;}/*求算符的优先级,入口参数为字符op*/int priority(char op){switch(op){case '\0': return (0);case ')': return (1);case '+': return (2);case '-': return (2);case '*': return (3);case '/': return (3);case '(': return (4);default: return (5);//定义各个支付对应的优先级}/*中缀表达式转换成后缀表达式,入口参数字符指针*in,*post*///*post中存入后缀表达式void change(char *in,char *post){pseqstack s;char c,w,y;int z1,z2;s=init_seqstack();if(!s){printf("initial fault");} //栈初始化失败输出initial fault push_seqstack(s,'\0'); /*转换之前将栈底存入‘\0’,标记作用,便于判断循环中是否到栈底*/w=*in; //w存入中缀表达式中第一个元素while(s->data[s->top]!='\0'||w!='\0') /*当s栈栈底元素不为‘\0’或者w不为‘\0’(w为\0时表示中缀表达式已经读完)时循环*/{if(isnum(w)){*post=w;post++;w=*(++in);} /*判断w是操作数时,将w赋给*post,并且指针post++,w中值被赋为*in中下一个元素*///w不是操作数时else{if(s->data[s->top]=='('&&w==')'){pop_seqstack(s,&y);w=*(++in);}/*栈顶为‘(‘且w为’)‘时栈顶元素出栈,但出栈元素’(‘不存入*post,w中值被赋为*in 中下一个元素*/else{/*比较栈顶元素与w运算符的优先级大小,若栈顶优先级更小,则w入栈否则栈顶出栈,并将出栈元素赋给*post,post++ */if(s->data[s->top]=='('||priority(s->data[s->top])<priority(w)) {push_seqstack(s,w);w=*(++in);}else{pop_seqstack(s,&y);*post=y;post++;}}}}*post='\0'; //字符串最后添加‘\0‘表示字符串终止destroy_seqstack(&s); //销毁栈}/*后缀表达式求值,入口参数为字符指针*b,其中存储了后缀表达式*/void result(char *b){pseqstack s;char ch,a,c,d,result;ch=*b++;s=init_seqstack();//循环在后缀表达式到结尾‘\0‘时终止while(ch!='\0'){if(isnum(ch)){push_seqstack(s,ch-'0');}//若ch 为操作数则存入栈中,否则进行运算else{pop_seqstack(s,&a);pop_seqstack(s,&c); //栈中最上方的两个数出栈计算switch(ch) //各种条件下的运算{case '+': d=a+c; break;case '-': d=c-a; break;case '*': d=a*c; break;case '/': d=c/a; break;}push_seqstack(s,d); //运算后的结果再压入栈中 }ch=*b++;}//循环完成后栈顶元素就是表达式最后的值,输出该值printf("%d",s->data[s->top]);destroy_seqstack(&s);}/*主函数*/int main(){int x,y;char a[MAX],b[MAX];gets(a); //输入中缀表达式,并且存入字符数组a[MAX]中puts(a); //输出保存得到的中缀表达式change(a,b); //调用函数得到后缀表达式puts(b); //输出后缀表达式result(b); //调用函数计算表达式的值,并输出该值getchar();getchar();return 0;}。

相关文档
最新文档