数据结构实验4四则运算表达式求值实验报告
数据结构表达式求值实验报告

竭诚为您提供优质文档/双击可除数据结构表达式求值实验报告篇一:数据结构实验二——算术表达式求值实验报告《数据结构与数据库》实验报告实验题目算术表达式求值学院:化学与材料科学学院专业班级:09级材料科学与工程系pb0920603姓学邮名:李维谷号:pb09206285箱:指导教师:贾伯琪实验时间:20XX年10月10日一、需要分析问题描述:表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。
设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。
问题分析:在计算机中,算术表达式由常量、变量、运算符和括号组成。
由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。
因而在程序设计时,借助栈实现。
设置运算符栈(字符型)和运算数栈(浮点型)辅助分析算符优先关系。
在读入表达式的字符序列的同时完成运算符和运算数的识别处理,然后进行运算数的数值转换在进行四则运算。
在运算之后输出正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。
算法规定:输入形式:一个(:数据结构表达式求值实验报告)算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。
为使实验更完善,允许操作数为实数,操作符为(、)、.(表示小数点)、+、-、*、/、^(表示乘方),用#表示结束。
输出形式:演示表达式运算的中间结果和整个表达式的最终结果,以浮点型输出。
程序功能:对实数内的加减乘除乘方运算能正确的运算出结果,并能正确对错误输入和无定义的运算报错,能连续测试多组数据。
测试数据:正确输入:12*(3.6/3+4^2-1)#输出结果:194.4无定义运算:12*(3.6/(2^2-4)+1)#输出结果:表达式出错,除数为0,无意义错误输入:12+s#输出结果:eRRoR!二、概要设计拟采用两种类型的展分别对操作数和操作符进行操作。
四则运算实验报告

实验3四则运算表达式求值背景在工资管理软件中,不可避免的要用到公式的定义及求值等问题。
对于数学表达式的计算,虽然可以直接对表达式进行扫描并按照优先级逐步计算,但也可以将中缀表达式转换为逆波兰表达式,这样更容易处理。
问题描述四则运算表达式求值,将四则运算表达式用中缀表达式,然后转换为后缀表达式,并计算结果。
基本要求使用二叉树来实现。
实现提示利用二叉树后序遍历来实现表达式的转换,同时可以使用实验2的结果来求解后缀表达式的值。
输入输出格式:输入:在字符界面上输入一个中缀表达式,回车表示结束。
输出:如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后缀表达式中两相邻操作数之间利用空格隔开;如果不正确,在字符界面上输出表达式错误提示。
选作内容(1)在输入输出方式上要求使用:输入:将中缀表达式存于文本文件中,程序从该文本文件中读出表达式。
输出:如果该中缀表达式正确,则将后缀表达式输出到该文件中原表达式的后面,它们之间用“---”后相连;如果不正确,请在输出表达式错误提示到该文件原表达式的后面,它们之间用“---”相连。
(2) 利用堆栈来实现中缀表达式转换为后缀表达式。
测试用例输入:21+23*(12-6)输出:21 23 12 6 -*+程序代码:#include <iostream>#include <string.h>using namespace std;#define SIZE 100#define STACKINCREMENT 10template<class T>//栈class stack{public:void InitStack() {S.base = (T *)malloc(SIZE * sizeof(T));if(!S.base) exit(0);S.top = S.base;S.stacksize = SIZE;}void DestroyStack(){free(S.base);}void ClearStack(){S.top = S.base;}bool StackEmpty(){if(S.top == S.base) return true;else return false;}int StackLength(){return (S.top - S.base);}bool GetTop(T &t){if(S.top != S.base){t = *(S.top - 1);return true;}else return false;}void Push(T t){if(S.top - S.base >= S.stacksize){S.base = (T *)realloc(S.base,(S.stacksize + STACKINCREMENT) * sizeof(T));if(!S.base) exit(0);S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;}*S.top = t;S.top++ ;}bool Pop(T &t){if(S.top == S.base) return false;else S.top-- ;t = *S.top ;return true;}private:struct SqStack{T *base;T *top;int stacksize;}S;};class BiTree{private:struct BiTreeNode{char OPT[10];BiTreeNode *lchild,*rchild;};BiTreeNode *T; //T是根结点int index; //index是后缀表达式转换二叉树时的索引int number_of_point ;//销毁一颗树void DestroyTree(BiTreeNode *T){if(T){DestroyTree(T->lchild);DestroyTree(T->rchild);free(T);}}void DestroyTree(){DestroyTree(T);}//1表示栈顶优先级高于待入栈的元素int compare(char a,char b){ //定义了任意两个运算符的优先级if(a == '(' && b == ')') return 0;else if((a == '+' && b == '*') || (a == '+' && b == '/') || (a == '-' && b == '*') || (a == '-' && b == '/')|| (a != ')' && b == '(') || (a == '(' && b != ')'))return -1;else return 1;}//递归构造start,end分别是一个式子开始值和结束值的索引/*递归构造中缀表达式转化为的二叉树(利用栈) */void InorderCreate(BiTreeNode *&T,char str[30][10],int start,int end){ if(start == end) { //递归终止if(!(T = (BiTreeNode *)malloc(sizeof(BiTreeNode)))) exit(0);strcpy(T->OPT,str[start]);T->lchild = NULL;T->rchild = NULL;}else{stack<char> opt;stack<int> num;num.InitStack();opt.InitStack();char last;int index;int a;bool jump = false;for(int i = start;i <= end;i++) { //begin求解优先级最小的一个运算符if(jump) break;number_of_point = 0 ;if(IsNumber(str[i][0]) || str[i][0] == '-' &&IsNumber(str[i][1]) )continue;else{char c = str[i][0];char b;if(i == start && c == '(') {start += 1;continue;}else if(opt.StackEmpty() || (opt.GetTop(b) && compare(b,c) == -1)){opt.Push(c);num.Push(i);}else{if(c != ')'){opt.Pop(b);num.Pop(a);if(!opt.StackEmpty()){opt.GetTop(b);if(compare(b,c) == 1){opt.Pop(b);num.Pop(a);opt.Push(c);num.Push(i);}else{opt.Push(c);num.Push(i);}}else{opt.Push(c);num.Push(i);}}else{for(opt.GetTop(b);compare(b,c) != 0;opt.GetTop(b)){opt.Pop(b);num.Pop(a);if(opt.StackEmpty()){opt.Push(b);num.Push(a);end -= 1;jump =true;break;}}if(compare(b,c) == 0) {opt.Pop(b);num.Pop(a);}}}}} //end,得到的是该步中的根结点字符last及其索引indexopt.Pop(last);num.Pop(index);if(!opt.StackEmpty()){opt.Pop(last);num.Pop(index);}opt.DestroyStack();num.DestroyStack();if(!(T = (BiTreeNode *)malloc(sizeof(BiTreeNode)))) exit(0);T->OPT[0] = last;T->OPT[1] = '\0';InorderCreate(T->rchild,str,start,index-1);InorderCreate(T->lchild,str,index+1,end);}}bool IsNumber(char a){ //判断一个字符是否为数值形式的if( a == '.' && number_of_point == 0 ) {number_of_point ++ ;return true;}else if('0' <= a && a <= '9') return true ;else return false;}//递归求解树表示的表达式的值double Operate(BiTreeNode *T){if(T->lchild==NULL && T->rchild==NULL){double num = atof(T->OPT); //调用系统函数atof()将字符串转换为浮点数return num;}double ld,rd;ld = Operate(T->lchild);rd = Operate(T->rchild);char c = T->OPT[0];switch(c){case '+': return ld+rd;break;case '-': return rd-ld;break;case '*': return ld*rd;break;case '/': return rd/ld;break;default:cout << " you have entered wrong data ! "<< endl ;return 0;break ;}}void display(BiTreeNode *T){if(T == NULL ) return ;display(T->rchild);display(T->lchild);cout << T->OPT << " " ;public:BiTree() {T = NULL ;index = 0 ;number_of_point = 0 ;}/*以下两个函数重载私有成员函数方便计算*/void InorderCreate(){char OPT[30][10];cout << "输入中缀表达式: " << endl;char c = getchar();bool flag = true;int i = 0,j = 0 ;while(c != 10) { //输入的是空格j = 0;if(c == '-' && flag == true) { //flag判断是否是一个负数的值OPT[i][j++] = c;for(c = getchar() ; IsNumber(c) ; c = getchar() )OPT[i][j++] = c;OPT[i++][j] = '\0';flag = false;}else if(IsNumber(c)){OPT[i][j++] = c;for(c = getchar();IsNumber(c);c = getchar())OPT[i][j++] = c;OPT[i++][j] = '\0';flag = false;}else //运算符时的处理{flag = true;OPT[i][j++] = c;OPT[i++][j] = '\0';c = getchar();}}InorderCreate(T,OPT,0,i-1);}double Operate(){return Operate(T);}void display(){display(T) ;}~BiTree() {DestroyTree();};int main(){BiTree tree;tree.InorderCreate();cout << endl << tree.Operate() << endl;tree.display() ;cout << endl ;return 0;}测试结果:。
数据结构实验报告--表达式求值

void Initstack1(stack1 *s>
{
(*s>->base = (int *>malloc(SIZE * (sizeof(int>>>
。
(*s>->top = (*s>->base
。
(*s>->stacksize = INCREMENT 。
}
int Ifempty2(stack2 *s>
<6)中缀转后缀并计算模块:
( 三 > 详细设计
1.元素类型 , 结点类型和指针类型:
typedef struct{
int stacksize 。 int *base 。
int *top 。
}Sqstack1,*stack1 。
typedef struct{
int stacksize 。
char *base 。
{
if(((a=='*'>||(a=='/'>>&&((b=='+'>||(b=='-'>||(b=='#'>>>
5PCzVD7HxA
return '>'
。
else
return '<'
。
}
<4)运算符操作模块;
int Operate(int a,char b,int c>
{
int t 。
if(b == '+'> t = a + c
{
【7A版】四则运算表达式求值实验报告

HUNANUNIVERSITY课程实习报告题目:四则运算表达式求值学生姓名:学生学号:专业班级:指导老师:完成日期:一、需求分析四则运算表达式求值,将四则运算表达式用中缀表达式表示,然后转换为后缀表达式,并计算结果。
本程序要求利用二叉树后序遍历来实现表达式的转换,同时可以使用实验2的结果来求解后缀表达式的值。
在字符界面上输入一个中缀表达式,回车表示结束。
如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后缀表达式中两相邻操作数之间利用空格隔开;如果不正确,在字符界面上输出表达式错误提示。
测试数据输入:21+23G(12-6)输出:2123126-G+二、详细设计输入和输出的格式输入本程序可以将输入的四则运算表达式(中缀表达式)转换为后缀表达式输出后缀表达式为://输出结果的位置表达式的值为://输出结果的位置三、调试分析本次实验的难点主要是在建立二叉树的问题上。
关于如何把中缀表达式存入二叉树中,我参考了网上的一些方法,成功实现了目标,但是却遇到了一个问题,那就是不能处理小数,甚至两位或两位以上的整数。
因为如果采用字符数组来存储操作数,运算符合一位整数还可以处理,但对于两位数就就会出问题,最后我改进采用字符串数组来存储操作数,成功解决了问题。
另外在处理输入的非法表达式问题中,我也费了很大功夫,但总体问题不大。
四、测试结果五、用户使用说明(可选)1、运行程序时提示输入四则运算表达式本程序可以将中缀表达式转化为后缀表达式,并计算结果请输入四则运算表达式:输出后缀表达式为:表达式的值为:程序源代码(c++)#include<iostream>#include<string>#include<stack>#include<iomanip>constintMaG=100;usingnamespacestd;classNode{public:charch[MaG];//考虑到数值有时会是两位数,所以使用字符串数组NodeGlChild;NodeGrChild;Node(){strcpy(ch,"");lChild=rChild=NULL;}~Node(){if(lChild!=NULL)deletelChild;if(rChild!=NULL)deleterChild;}};staticintcount=0;staticchararray[MaG];//保存原始的中缀表达式staticcharstr[2GMaG];//保存后序遍历出来的字符串,为表达式求值提供方便staticintk=0;chargetOp(NodeGtemp);//temp指针保存每个结点,返回的是运算符NodeGcrtTree(NodeGroot);//传入根结点指针,返回根结点指针voidoutput(NodeGroot);//获得处理后的字符串boolisError(char);//判断字符是否有问题voiddeal();//对字符数组进行处理doublevalue(string);//计算后缀表达式,得到其结果。
数据结构实验四:四则运算表达式

HUNAN UNIVERSITY 课程实验报告题目:四则运算学生姓名学生学号专业班级指导老师李晓鸿完成日期 2 0 1 5年12 月10日一、需求分析1.程序的功能本程序要求首先输入一组数据进行四则运算,输入的数据是按照中缀表达式的结构输入的,完成初始化后,把中缀表达式用后缀表达式(逆波兰表达式)输出,同时输出计算结果。
2.输入的形式输入一个平时所用的正常的四则运算表达式(不需要特别注意输入式子是否正确),输入的数字的范围是(0至2^16)的小数或者整数,输入的符号限于(+-*/^)3.输出的形式程序的输出就是转化后的后缀表达式以及计算的结果,输出结果间用空格隔开;4.测试数据①正常的输入输入21+23*(12-6)输出后续表达式为21 23 12 6 - * +计算结果为159②输入有两个符号的错误情况输入6*3++4*(14-8)输出非括号运算符不能直接接非括号运算符ERROR③输入有小数的情况输入2.0*(11.2-5.3)+2.5后续表达式为2.0 11.2 5.3 - * 2.5 +计算结果为14.3④有整数小数的情况输入2/(3.0+5)*3输出后续表达式为2 3.0 5 + / 3 * 计算结果为0.75⑤错误的输入输入2a+3输出a为非法字符error二、概要设计1.抽象数据类型本题目中,首先需要按顺序读取数字和操作符,将它们分别保存到两个数据结构中,如果最先保存的操作符优先级不大于接下来保存的操作符,将一直不被调用直到上一级操作符被调用,满足先进后出的数据结构,所以用栈来保存操作符。
对于保存的数字,每次调用操作符时,同时将最后保存的两位数字调用,满足先进后出的数据结构,所以用栈来保存数字。
由于需要用后缀表达式输出,按照进栈出栈的顺序,我们将符号作为节点,数字作为左右子树,依次相连成为一颗二叉树,通过后续遍历将二叉树输出。
2.算法的基本思想①.本题目在之后的操作中需要将数字和操作符进入不同的栈,所以我们在程序设计之前需要先设计函数判断读取的字符是数字还是操作符。
【数据结构与数据库-实验报告】表达式求值(栈)

8 / 20
版权归原作者 Amber 所有
break; } } return GetTop2(OPND); } int main( ) { printf("请输入正确的表达式以'#'结尾:"); do{ gets(expr); }while(!*expr); InitStack(&OPTR); /* 初始化运算符栈 */ Push(&OPTR,'#'); /* 将#压入运算符栈 */ InitStack2(&OPND); /* 初始化操作数栈 */ printf("表达式结果为:%d\n", EvalExpr()); return 0; }
6 / 20
版权归原作者 Amber 所有
case '+' : return (a+b); case '-' : return (a-b); case '*' : return (a*b); case '/' : return (a/b); } return 0; } 8、返回操作数的长度 int num(int n) { char p[10]; itoa(n,p,10);//把整型转换成字符串型 n=strlen(p); return n; } 9、主要操作函数 int EvalExpr() { char c,theta,x; int n,m; int a,b; c = *ptr++; while(c!='#'||GetTop(OPTR)!='#') {
版权归原作者 Amber 所有
数据结构与数据库 实验报告
题 院 姓 学
数据结构实验报告 表达式求值

(一) 需求分析1、输入的形式和输入值的范围:根据题目要求与提示,先选择你要使用的表达式形式(中缀用1,后缀用0),在输入一个中缀表达式,输入数的范围为int型,此时,程序将计算出表达式的结果。
2、输出的形式:当按照程序要求选择了1或0之后,再输入表达式;如果选择的是1,则程序将自动运算出表达式结果;如果之前选择的是0,则程序将现将中缀表达式转化为后缀表达式并计算出结果。
3、程序所能达到的功能:本程序能计算出含+、-、*、/、(、)等运算符的简单运算。
4、测试数据:输入一个表达式,如果你之前选择的是“中缀表达式”,那么输入5*(4-2)#,那么输出结果是10;如果之前选择的是“后缀表达式”,那么输入5*(4-2)#,那么他将先转换成后缀表达式5 4 2 - * #,再输出结果10。
如果输入表达式没有结束标示符#,如5*(4-2),那将不会输出任何结果,或出现错误结果。
(二) 概要设计为了实现上述操作,应以栈为存储结构。
1.基本操作:(1). int GetTop(SqStack *s)初始条件:栈存在;操作结果:若栈为空,则返回s的栈顶元素;否则返回ERROR。
(2).void Push(SqStack *s,int e)初始条件:栈存在;操作结果:插入e为新的栈顶元素。
(3).int Pop(SqStack *s)初始条件:栈存在;操作结果:若栈不空,则删除之,并返回其值;否则返回REEOR。
(4).void InitStack(SqStack *s)初始条件:栈存在;操作结果:置栈为空。
(5).int Empty(SqStack *s)初始条件:栈存在;操作结果:判定s是否为空栈。
(6).int Operate(int a,char theta, int b)初始条件:操作数a和b存在,且theta是+、-、*、/四则运算;操作结果:返回a与b间theta运算的结果。
(7).int In(char s,char* TestOp)初始条件:s为待判断字符,TestOp为已知的算符集合;操作结果:s为算符集合中的元素则返回1,否则返回0.(8).int ReturnOpOrd(char op,char* TestOp)初始条件:op为待确定运算符,TestOp为已知的算符集合;操作结果:确定运算符类型。
数据结构表达式求值实验报告

数据结构表达式求值实验报告数据结构表达式求值实验报告第一章引言数据结构是计算机科学中重要的基础知识之一,它研究的是数据在计算机中的存储和组织方式,以及基于这些方式进行操作和运算的算法。
表达式求值是数据结构中一个重要的应用场景,它涉及到从一个给定的表达式中计算出最终结果的过程。
本实验旨在通过实际编程实践,掌握表达式求值的算法和数据结构的应用。
第二章实验目的1.理解表达式的概念。
2.熟悉常见表达式求值算法。
3.掌握栈的基本操作。
4.实现一个表达式求值的程序。
第三章实验内容1.表达式的定义:________表达式是由运算符和运算数组成的字符串,它代表了一种计算规则。
2.表达式的分类:________根据运算符的位置和计算顺序,表达式可以分为前缀表达式、中缀表达式和后缀表达式。
3.表达式求值的算法:________1. 前缀表达式求值算法:________1) 创建一个空栈。
2) 从右往左遍历前缀表达式。
3) 如果当前字符是运算符,则将栈顶的两个元素出栈,进行相应的运算,将结果入栈。
4) 如果当前字符是运算数,则将其转化为整数形式,并入栈。
5) 最终栈内只剩下一个元素,即为表达式的求值结果。
2. 中缀表达式求值算法:________1) 将中缀表达式转化为后缀表达式。
2) 创建一个空栈。
3) 从左往右遍历后缀表达式。
4) 如果当前字符是运算符,则将栈顶的两个元素出栈,进行相应的运算,将结果入栈。
5) 如果当前字符是运算数,则将其转化为整数形式,并入栈。
6) 最终栈内只剩下一个元素,即为表达式的求值结果。
3. 后缀表达式求值算法:________1) 创建一个空栈。
2) 从左往右遍历后缀表达式。
3) 如果当前字符是运算符,则将栈顶的两个元素出栈,进行相应的运算,将结果入栈。
4) 如果当前字符是运算数,则将其转化为整数形式,并入栈。
5) 最终栈内只剩下一个元素,即为表达式的求值结果。
4.实验代码实现:________根据算法描述,使用编程语言实现一个表达式求值的程序。
数据结构表达式求值(中缀)实验报告

数据结构表达式求值(中缀)实验报告题目名称表达式求值学号姓名指导教师日期一1. 问题描述:在计算机中,算术表达式由常量、变量、运算符和括号组成。
由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行,在程序设计时,借助栈实现。
2. 表达式求值这个程序,主要利用栈和数组,把运算的先后步骤进行分析并实现简单的运算,以字符列的形式从终端输入语法的正确的、不含变量的整数表达式。
利用已知的算符优先关系,实现对算术四则运算的求值,在求值中运用栈、运算栈、输入字符和主要操作的变化过程。
该程序相当于一个简单的计算机计算程序,只进行简单的加减乘除和带括号的四则运算。
1、基本思想(中缀表达式求值)要把一个表达式翻译成正确求值的一个机器指令序列,或者直接对表达式求值,首先要能够正确解释表达式,要了解算术四则运算的规则即:(1)先乘除后加减;(2)从左到右计算;(3)先括号内,后括号外。
下表定义的运算符之间的关系:b + - * / () # a+ > > < < < > > _ > > < < < > > * > > > > < > > / > > > > < > > ( < < < < < = ) > > > > > > # < < < < < =为了实现运算符有限算法,在程序中使用了两个工作栈。
分别是:运算符栈OPTR,操作数栈OPND.基本思想:(1)首先置操作数栈为空栈,表达式起始符“#”为运算符栈的栈底元素;(2)依次读入表达式中每个字符,若是操作数则进OPND栈,若是运算符则和OPTR栈得栈顶运算符比较优先级后作相应操作。
表达式求值实验报告

表达式求值实验报告西南大学数据结构实验报告学院:专业:班级:姓名:学号:实验报告一、实验题目:表达式表达式二、实验目的和建议:目的:(1)通过该算法的设计思想,熟识栈的特点和应用领域方法;(2)通过对波函数优先法对算术表达式表达式的算法继续执行过程的模拟,认知在继续执行适当栈的操作方式时的变化过程。
(3)通过程序设计,进一步熟识栈的基本运算函数;(4)通过自己动手同时实现算法,强化从伪码算法至c语言程序的同时实现能力。
建议:(1)采用栈的顺序存储则表示方式;(2)采用波函数优先法;(3)用c语言同时实现;(4)从键盘输入一个符合要求的算术表达式,输入恰当的结果。
三、实验过程:#include#include#include#include#include#include#include#include#include#inclu de#include//函数结果状态代码#definetrue1#definefalse0#defineok1#defineerror0#defineinfeasible-1typedefintstatus;//status就是函数的类型,其值就是函数结果状态代码,如ok等typedefintelemtype;constintstack_init_size=100;constintstackincrement=10;typed efstruct{elemtype*base;elemtype*top;intstacksize;}stack;statusinitstack(stack&s){//构造一个空栈ss.base=(elemtype*)malloc(stack_init_size*sizeof(elemtype));if(!s.base)exit(er ror);s.top=s.base;s.stacksize=stack_init_size;returnok;}statuspush(stack&s,ele mtypee){//插入元素e为新的栈顶元素if(s.top-s.base>=s.stacksize){s.base=(elemtype*)realloc(s.base,(s.stacksize+stackincrem ent)*sizeof(elemtype));if(!s.base)exit(overflow);s.top=s.base+s.stacksize;s.st acksize+=stackincrement;}*s.top++=e;returnok;}statuspop(stack&s,elemtype&e){//若栈不空,则删除,用e返回其值,并返回ok;否则返回errorif(s.top==s.base)returnerror;e=*--s.top;returnok;}statusgettop(stack&s){//若栈不空,用e返回s的栈顶元素,并返回ok;否则返回errorif(s.top==s.base)returnerror;return*(s.top-1);}operate.h:#include\statusin(charc){//辨别c与否为运算符if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')returnok;elsereturnerror;}statusoper ate(inta,charc,intb){//二元运算switch(c){case'+':returna+b;break;case'-':returna-b;break;case'*':returna*b;break;case'/':if(b==0){printf(\(提示信息:存有除数为零错误)\\n\);returnerror;}//除数无法为零elsereturna/b;break;}}charprecede(chara,charb){//波函数间优先关系switch(a){case'+':switch(b){case'+':return'>';break;case'-':return'>';break;case'*':return'';break;case'#':return'>';break;}break;case'-':switch(b){case'+':return'>';break;case'-':return'>';break;case'*':return'';break;case'#':return'>';break;}break;case'*':switch(b){case'+':return'>';break;case'-':return'>';break;case'*':return'>';break;case'/':return'>';break;case'(':return'';break;case'#':return'>';break;}break;case'/':switch(b){case'+':return'>'; break;case'-':return'>';break;case'*':return'>';break;case'/':return'>';break;case'(':return'';break;case'#':return'>';break;}break;case'(':switch(b){case'+':return'';b reak;case'-':return'>';break;case'*':return'>';break;case'/':return'>';break;case')':return'>';break;case'#':return'>';break;}break;case'#':switch(b)。
数据结构课程设计_实验报告(一)表达式求值(计算器)

数据结构课程设计实验报告起止时间:2015.12.28-2015.12.311、输入:tan452、输出:13、执行结果::设计过程中遇到的问题及解决办法:问题:算数表达式以字符串输入,操作数和操作符的提取;解决办法:两两操作符之间如有数字将中间的数字提取强制转换成double型;参考文献:(在设计中参考的书籍、网站等资料)1. 朱振元,《数据结构——C++语言描述》,清华大学出版社,2008年,页码:2. /detail/gszhouyi/738777指导老师评议:成绩评定:指导教师签名:附件:(程序源代码)#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#define N 100#define pai 3.1415926typedef struct yxj{char operat;int rank;}yxj;typedef struct str{char data[N];}zs;void sjhs(void){char s[10],a[10];double y,x;printf("请输入(sin cos tan 角度制)表达式:\n");scanf("%s",s);if(strstr(s,"sin")!=0){int i=0,j=0;while(s[i]!='\0'){if(s[i]>='0'&&s[i]<='9')s[j++]=s[i];i++;}s[j]='\0';x=atof(s);y=sin(x*pai/180);}else if(strstr(s,"cos")!=0){int i=0,j=0;while(s[i]!='\0'){if(s[i]>='0'&&s[i]<='9')s[j++]=s[i];i++;}s[j]='\0';x=atof(s);y=cos(x*pai/180);}else if(strstr(s,"tan")!=0){int i=0,j=0;while(s[i]!='\0'){if(s[i]>='0'&&s[i]<='9')s[j++]=s[i];i++;}s[j]='\0';x=atof(s);y=tan(x*pai/180);}else{printf("格式错误\n");return;}printf("%lf\n",y);printf("*****1、继续*****\n");printf("*****0、返回上一层*****\n");scanf("%s",a);if(strcmp(a,"0")==0)return;else if(strcmp(a,"1")==0)sjhs();elseprintf("没有该选项\n");}void szys(yxj mark[]){yxj os[N];char a[10];char ch;double ns[N];zs zhan[20];int numb[N];int Len,p=0,q=1,i,o=1,n=0;char data[N];os[0]=mark[0];ns[0]=0;printf("请输入算术(+ - * / ^)表达式(以= 结束):\n");scanf("%s",data);if(strcmp(data,"+")==0||strcmp(data,"-")==0||strcmp(data,"*")==0||strcmp(data,"/")==0 ||strcmp(data,"^")==0||strcmp(data,"=")==0){printf("格式错误\n");return;}Len=strlen(data);numb[0]=0;for(i=0;i<20;i++)zhan[i].data[0]='\0';for(i=0;i<Len;i++){int t=0;if((data[i]=='^'||data[i]=='+'||data[i]=='-'||data[i]=='*'||data[i]=='/'||data[i]=='('||data[i]==')'||data[i]=='=')) {int j,k=0;if((data[i]=='='||data[i]=='^'||data[i]=='+'||data[i]=='-'||data[i]=='*'||data[i]=='/')&&(data[i-1]=='^'||data[i-1]=='+'||data[i-1]=='-'||data[i-1]=='*'||data[i-1]=='/')){printf("格式错误\n");return;}numb[q++]=i;while(zhan[(p+k)/2].data[0]!='\0'){k++;}for(j=numb[q-2];j<numb[q-1];j++)if(data[j]>='0'&&data[j]<='9'||data[j]=='.')zhan[(p+k)/2].data[t++]=data[j];zhan[(p+k)/2].data[t]='\0';if(zhan[(p+k)/2].data[0]!='\0')ns[n++]=atof(zhan[(p+k)/2].data);p++;for(j=0;j<8;j++)if(mark[j].operat==data[i])break;while(1){.if(mark[j].operat=='('){os[o++]=mark[j];break;}else if(mark[j].rank>os[o-1].rank&&mark[j].operat!='(') {os[o++]=mark[j];break;}else{double numb1,numb2,numb;switch(ch=os[--o].operat){case '+':{numb1=ns[--n];numb2=ns[--n];numb=numb1+numb2;ns[n++]=numb;break;}case '-':{numb1=ns[--n];numb2=ns[--n];numb=numb2-numb1;ns[n++]=numb;break;}case '*':{numb1=ns[--n];numb2=ns[--n];numb=numb2*numb1;ns[n++]=numb;break;}case '/':{numb1=ns[--n];numb2=ns[--n];if(numb1==0){printf("无效操作\n");return;}else{numb=numb2/numb1;ns[n++]=numb;}break;}case '^':{numb1=ns[--n];numb2=ns[--n];numb=pow(numb2,numb1);ns[n++]=numb;break;}}}}}else if(data[i]>='0'&&data[i]<='9');else if(data[i]=='.');else{printf("格式错误,请重新输入:\n");szys(mark);break;}}printf("%lf\n",ns[0]);printf("*****1、继续*****\n");printf("*****0、返回上一层*****\n");scanf("%s",&a);if(strcmp(a,"0")==0)return;else if(strcmp(a,"1")==0)szys(mark);elseprintf("没有该选项\n");}int main (){yxj mark[9];mark[0].operat='#';mark[0].rank=-1;mark[1].operat='+';mark[1].rank=1;mark[2].operat='-';mark[2].rank=1;mark[3].operat='*';mark[3].rank=2;mark[4].operat='/';mark[4].rank=2;mark[5].operat='(';mark[5].rank=-1;mark[6].operat=')';mark[6].rank=-1;mark[7].operat='=';mark[7].rank=0;mark[8].operat='^';mark[8].rank=3;while(1){char i[10];printf("*****1、四则运算计算器*****\n");printf("*****2、三角函数计算器*****\n");printf("*****0、退出*****\n");scanf("%s",&i);if(strcmp(i,"0")==0)break;else if(strcmp(i,"1")==0)szys(mark);else if(strcmp(i,"2")==0)sjhs();elseprintf("没有该选项\n");}}。
数据结构实验报告-表达式求值与任务调度

数据结构与程序设计实验实验报告哈尔滨工程大学实验报告二printf("序号开始时间等待时间结束\n");que[0]=0;rear=1;T[0].start=0;i=0;t=0;j=1;while(i<n){t++;//时间移动i+=check(tdiff);//时间移动后检查是否有完成的任务,并且就算等待时间if(t>=T[j].t&&j<n){//假入在当前任务执行时间内有任务提交insert(j); //把任务插入到队列j++;qsort(que, rear, sizeof(que[0]), comp);//按时间长短排序}if(T[que[0]].start==-1)//给队列最前点赋起始值T[que[0]].start=t;}for(i=0;i<n;i++)//计算出所有等待时间sum+=T[i].wait;printf("平均等待时间为%.3lfs\n\n",sum/n);}四、界面设计1.表达式求值需要输入以’#’结尾的中缀表达式,以提示语句的方式给出。
输出注明是什么结果。
2.任务调度需要输入任务数,任务需要执行时间,(不同时需要任务提交时间),按平均等待时间最短为原则,输出出任务的执行顺序。
五、运行测试与分析1.表达式求值1).输入一个以’#’结尾的中缀表达式:2).输出计算结果,后缀表达式以及前缀表达式:3.任务调度:(1). 同时提交i).输入:ii).输出:(2). 不同时间提交i).输入:ii).输出:六、实验收获与思考1.熟练掌握栈的定义及使用。
2.了解表达式求值的转换算法。
设计前、后缀表达式求值算法。
3.设计操作数为多位实数,操作符为加、减、乘、除、求模的中缀表达式求值算法。
定义算数符号的优先级。
数据结构c语言版算术四则混合运算实验报告

数据结构c语言版算术四则混合运算实验报告一、引言在计算机科学领域,算术四则运算是最基本的运算之一。
本实验旨在通过使用C语言编写程序,实现算术四则运算的混合运算功能。
通过该实验,我们可以提高对数据结构的理解,并掌握在C语言中实现算术四则混合运算的方法。
二、实验目的1. 理解算术四则运算的基本原理;2. 掌握数据结构在算术四则运算中的应用;3. 使用C语言编写程序,实现算术四则混合运算功能。
三、实验方法1. 首先,我们需要定义并实现一个栈数据结构,用于存储运算符和操作数;2. 然后,通过读取用户输入的表达式,将其中的运算符和操作数依次入栈;3. 在入栈的过程中,我们需要判断运算符的优先级,以确保正确的运算顺序;4. 最后,通过出栈的方式,按照正确的运算顺序进行运算,并输出结果。
四、实验步骤1. 定义并实现栈数据结构,包括入栈、出栈等基本操作;2. 读取用户输入的表达式,并将其中的运算符和操作数依次入栈;3. 根据运算符的优先级,确定出栈的顺序,并进行相应的运算;4. 将运算结果入栈,继续进行下一轮的运算,直到表达式中的所有运算符和操作数都被处理完毕;5. 最后,将最终的运算结果出栈,并输出。
五、实验结果通过本实验,我们成功实现了算术四则混合运算的功能。
经过多组测试,程序能够正确处理各种复杂的运算表达式,并给出正确的结果。
六、实验总结通过本次实验,我们进一步加深了对数据结构的理解,并成功将其应用于算术四则混合运算中。
我们掌握了C语言中实现算术四则混合运算的方法,并通过编写程序实现了该功能。
通过本次实验,我们不仅提高了对数据结构的应用能力,还提升了编程能力和问题解决能力。
在今后的学习和工作中,我们将继续深入研究数据结构和算法,不断提升自己的编程技术,为解决实际问题提供更好的解决方案。
七、致谢感谢指导老师对本实验的支持和指导,感谢实验室的同学们在实验过程中给予的帮助和建议。
本次实验的顺利完成离不开你们的支持与帮助。
数据结构表达式求值实验报告-无删减范文

数据结构表达式求值实验报告数据结构表达式求值实验报告1. 引言表达式求值是计算机科学中的一个重要问题,也是数据结构的一个经典应用。
通过将中缀表达式转换为后缀表达式,并利用栈这一数据结构,可以实现对表达式的有效求值。
本实验旨在探究数据结构在表达式求值中的应用。
2. 实验内容本实验中,我们将实现一个表达式求值的程序。
具体步骤如下:1. 将中缀表达式转换为后缀表达式。
2. 使用栈来求解后缀表达式。
3. 算法原理3.1 中缀表达式转后缀表达式中缀表达式是我们常见的数学表达式,如 2 + 3 4。
而后缀表达式是将操作符放在操作数后面的表达式,上述中缀表达式的后缀表达式为 2 3 4 +。
中缀表达式到后缀表达式的转换可以通过以下步骤完成:1. 初始化一个栈和一个输出队列。
2. 从左到右遍历中缀表达式的每个字符。
3. 如果当前字符是数字,将其加入输出队列。
4. 如果当前字符是左括号,将其压入栈。
5. 如果当前字符是右括号,将栈中的操作符依次弹出并加入输出队列,直到遇到左括号为止。
6. 如果当前字符是操作符,将其与栈顶操作符进行比较:1. 如果栈为空,或者栈顶操作符为左括号,直接将当前操作符压入栈。
2. 否则,比较当前操作符与栈顶操作符的优先级,如果当前操作符的优先级较低,将栈顶操作符弹出并加入输出队列,然后将当前操作符压入栈。
3. 如果当前操作符的优先级大于等于栈顶操作符的优先级,则直接将当前操作符压入栈。
7. 遍历完中缀表达式后,将栈中的操作符依次弹出并加入输出队列。
3.2 后缀表达式求值通过将中缀表达式转换为后缀表达式,我们可以利用栈来对后缀表达式进行求值。
具体求值操作如下:1. 初始化一个栈。
2. 从左到右遍历后缀表达式的每个字符。
3. 如果当前字符是数字,将其加入栈。
4. 如果当前字符是操作符,从栈中弹出两个数字,进行相应的运算,然后将结果加入栈。
5. 遍历完后缀表达式后,栈中的元素即为最终的结果。
4. 实验结果我们用中缀表达式\。
数据结构表达式求值实验报告

数据结构表达式求值实验报告数据结构表达式求值实验报告⒈引言本实验旨在研究和实现数据结构中表达式求值的算法。
表达式求值是计算机科学中常见的问题,对于计算机程序的正确性和性能具有重要影响。
本报告将详细介绍实验设计、实验步骤、实验结果及分析,并对实验过程中遇到的问题进行讨论。
⒉实验设计⑴实验目的本实验的目的是实现一个可以对常见的算术表达式进行求值的算法,包括支持基本的加减乘除运算符和括号。
⑵实验环境●操作系统:Windows 10●开发语言:C++●开发工具:Visual Studio 2019⑶数据结构设计为了实现表达式求值的算法,我们需要设计适当的数据结构来存储和处理表达式。
本实验中,我们选择使用栈来实现表达式求值。
●表达式栈:用于存储操作数和运算符。
●运算符栈:用于存储运算符。
⑷算法设计表达式求值的算法可以分为以下几个步骤:●遍历表达式,逐个处理操作数和运算符:●如果是操作数,入表达式栈。
●如果是运算符,与运算符栈栈顶元素进行比较,根据优先级决定如何处理。
●当表达式遍历完成后,依次处理剩余的运算符。
●最终表达式栈中的元素即为求值结果。
⒊实验步骤⑴数据结构实现根据设计,我们首先实现表达式栈和运算符栈的数据结构,包括入栈、出栈等操作。
⑵表达式输入与预处理用户输入待求值的表达式,进行预处理,去除空格、验证表达式的合法性等。
⑶表达式求值算法实现根据前述的算法设计,实现表达式求值的算法,利用表达式栈和运算符栈来处理表达式。
⑷测试与结果分析对于不同的测试用例,进行表达式求值的测试,并分析结果的正确性和性能。
⒋实验结果与分析经过实验测试,我们得到了表达式求值的结果。
结果显示,我们的算法能够正确地求得表达式的值,而且性能良好。
⒌讨论与总结在实验过程中,我们遇到了一些问题,并进行了讨论和解决。
通过这个实验,我们更加深入地理解了表达式求值的算法,并对数据结构的应用有了更清晰的认识。
附件:无法律名词及注释:●无。
数据结构 四则运算表达式求值 实验四报告

为后缀表达式。
(3) 计算模块:计算后缀表达式的值。
(4) 输出模块:输出后缀表达式及其计算结果。
三、详细设计
物理数据类型
因为表达式由用户输入,存储操作符和操作数的栈长度不能确定,所以使用链式堆栈存
储这些变量。
堆栈基本操作如下:
bool push(const Elem& item) //压栈
{
top=new link<Elem>(item,top);
表达式。
运算时,运算符栈顶弹栈,然后获取操作数栈顶和次栈顶的值进行运算,把运算结果创
建一个叶子结点保存,把结点压回操作数栈中。如果操作数栈或运算符栈不为空时,继续进
行运算操作。最后操作数栈中的值,就是运算结果。
程序的流程
(1) 输入模块:输入把原始的中缀表达式的操作数和操作字符存储为一个字符串。 (2) 处理模块:把字符串逐个分解,调整各项字符的顺序,分解的中缀表达式转换
EvalExpr(ch[i],S); //弹栈,运算部分
i++;
}
}
if(S.length()==1)
S.pop(result);
}
(2)、 转换实数
int EvalValue(char* ch,Stack<double> &S)
{
int i=0;
double result=0;
char a;
a=ch[i];
}
bool topValue(Elem& it) const //获取栈顶的值
{
if(size==0) return false;
it=top->elem;
return true;
数据结构表达式求值实验报告

实验二表达式求值
实验内容:
用算符优先法设计一个具有加、减、乘、除四功能的计算程序。
实验目的与要求:
掌握栈的数据结构和基本操作。
实验原理:
1.表达式是由操作数,运算符和界限符组成。
2.实现算符优先算法,实用两个工作栈。
一个叫OPTR,用以寄存运算符;一个叫OPND,用以寄存操作数或运算结果。
3.算法的基本思路:
(1)首先置操作数栈为空栈,表达式起始符#作为运算符栈的栈底元素;
(2) 依次读入表达式中的每个字符,通过运算符判断函数In()使操作数进OPND 栈;
(3)通过函数Precede()将运算符与OPTR栈的栈底运算符比较出优先权,若栈顶元素优先权低则输入下个操作数到OPND,若两优先权相等,脱号并接受下一个字符,若栈顶元素优先高,退栈并将运算结果(通过函数Operate()运算)入栈。
循环上述操作直到表达式求值结束。
(4)返回运算结果。
4.所用的函数及作用:
InitStack():构造一个空栈
Push():插入元素进栈
GetTop():返回栈顶元素
Precede():运算符优先权进行判断
Pop():元素出栈
Operate():运算操作数
5. 测试结果与分析
上述程序在Visual C++ 6.0环境下加以实现。
经过多次测试,程序运行正确。
运行结果。
如图所示:
6. 收获与体会
通过这次课程设计:
1.我又进一步巩固了C语言的基础,尤其是栈。
2.算法中需要建很多的函数,队提高了自己的编程能力有帮助,
3.程序不够简洁,还有待改进,功能还有待更完善。
数据结构实验报告——四则运算表达式求值

数据结构实验报告——四则运算表达式求值实验五四则运算表达式求值一.问题描述:四则运算表达式求值,将四则运算表达式用中缀表达式,然后转换为后缀表达式,并计算结果。
二.基本要求:使用二叉树来实现。
三.实现提示:利用二叉树后序遍历来实现表达式的转换,同时可以使用实验二的结果来求解后缀表达式的值。
输入输出格式:输入:在字符界面上输入一个中缀表达式,回车表示结束。
输出:如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后缀表达式中两相邻操作数之间利用空格隔开;如果不正确,在字符界面上输出表达式错误提示。
测试实例:输入:21+23* (12-6 )输出:21 23 12 6 -*+四.设计概要用二叉树表示表达式:若表达式为数或简单变量,则相应二叉树中仅有一个根结点,其数据域存放该表达式信息若表达式= (第一操作数)(运算符)(第二操作数),则相应的二叉树中以左子树表示第一操作数,右子树表示第二操作数,根结点的数据域存放运算符(若为一元算符,则左子树空)。
操作数本身又为表达式.后缀遍历二叉树码实现和静态检查上机调试及测试数据的调试五.源程序:#include#include#include#include#include#include#define STACK_INIT_SIZE 100#define DATA_SIZE 10#define STACKINCREMENT 10#define OK 1#define TRUE 1#define FALSE 0#define ERROR 0#define OVERFLOW -2using namespace std;typedef float SElemtype;typedef int Status;typedef char * TElemType;typedef struct BiTNode {TElemType data;int len; //data字符串中字符的个数struct BiTNode * lchild, * rchild;}BiTNode, *BiTree;typedef struct{SElemtype *base;SElemtype *top;int stacksize;} SqStack;Status IsDigital(char ch)if(ch>='0'&&ch<='9'){return 1; //是数字字母}return 0; //不是数字字母}int CrtNode(stack &PTR, char *c){BiTNode * T;int i=0;T = (BiTNode *)malloc(sizeof(BiTNode));T->data = (char *)malloc(DATA_SIZE*sizeof(char));while(IsDigital(c[i])){T->data [i] = c[i];i++;}T->len = i;T->lchild = T->rchild = NULL;PTR.push (T);return i;}void CrtSubTree(stack &PTR, char c){BiTNode * T;T = (BiTNode *)malloc(sizeof(BiTNode));T->data = (char *)malloc(DATA_SIZE*sizeof(char));T->data [0] = c;T->len = 1;T->rchild = PTR.top(); //先右子树,否则运算次序反了PTR.pop ();T->lchild = PTR.top();PTR.pop ();PTR.push (T);}char symbol[5][5]={{'>', '>', '<', '<', '>'}, //符号优先级{'>', '>', '<', '<', '>'},{'>', '>', '>', '>', '>'},{'>', '>', '>', '>', '>'},{'<', '<', '<', '<', '='}};int sym2num(char s) //返回符号对应优先级矩阵位置{switch(s){case '+': return 0; break;case '-': return 1; break;case '*': return 2; break;case '/': return 3; break;case '#': return 4; break;}}char Precede(char a, char b) //返回符号优先级{return(symbol[sym2num(a)][sym2num(b)]);void CrtExptree(BiTree &T, char exp[]){//根据字符串exp的内容构建表达式树Tstack PTR;//存放表达式树中的节点指针stack OPTR;//存放操作符char op;int i=0;OPTR.push ('#');op = OPTR.top();while( !((exp[i]=='#') && (OPTR.top()=='#')) ) //与{ if (IsDigital(exp[i])){//建立叶子节点并入栈PTRi+=CrtNode(PTR, &exp[i]);}else if (exp[i] == ' ')i++;else{switch (exp[i]){case '(': {OPTR.push (exp[i]);i++;break;}case ')': {op = OPTR.top (); OPTR.pop ();while(op!='('){CrtSubTree(PTR, op);op = OPTR.top (); OPTR.pop ();}//end whilei++;break;}default: //exp[i]是+ - * /while(! OPTR.empty ()){op = OPTR.top ();if (Precede(op, exp[i])=='>'){CrtSubTree(PTR, op);OPTR.pop ();}if(exp[i]!='#'){OPTR.push (exp[i]);i++;}break;}}//end switch}//end else}//end whileT = PTR.top();PTR.pop ();}void PostOrderTraverse(BiTree &T, char * exp ,int &count){//后序遍历表达式树T,获取树中每个结点的数据值生成逆波兰表达式exp //T是表达式树的根节点;字符串exp保存逆波兰表达式;count保存exp中字符的个数//后序遍历中,处理根结点时,依据T->len的值,把T->data中的字符依次添加到当前exp字符串的尾端//添加完T->data后,再添加一个空格字符,同时更新count计数器的值。
数据结构表达式求值实验报告

数据结构表达式求值实验报告一、实验目的本次实验的主要目的是通过实现表达式求值的程序,深入理解数据结构和算法在解决实际问题中的应用。
具体包括掌握栈这种数据结构的操作和使用,熟悉表达式的转换和计算过程,提高编程能力和问题解决能力。
二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。
三、实验原理表达式求值是程序设计中的一个常见问题,通常采用栈这种数据结构来实现。
表达式可以分为中缀表达式、后缀表达式和前缀表达式。
中缀表达式是我们日常使用的表达式形式,如“2 +3 4”,但直接对中缀表达式求值比较复杂。
而后缀表达式(如“2 3 4 +”)和前缀表达式(如“+2 3 4”)求值相对简单。
因此,在实现表达式求值时,通常先将中缀表达式转换为后缀表达式,然后对后缀表达式进行求值。
转换过程中,使用两个栈,一个用于存储操作数,另一个用于存储运算符。
求值过程中,根据后缀表达式的特点,从左到右依次处理操作数和运算符,进行相应的计算。
四、实验步骤1、定义数据结构定义栈类,用于存储操作数和运算符。
定义一个结构体来表示操作数和运算符。
2、中缀表达式转后缀表达式从左到右扫描中缀表达式。
遇到操作数,直接输出。
遇到运算符,根据其优先级与栈顶运算符的优先级进行比较,决定入栈或出栈操作。
3、后缀表达式求值从左到右扫描后缀表达式。
遇到操作数,入栈。
遇到运算符,从栈中取出两个操作数进行计算,将结果入栈。
4、主函数输入中缀表达式。
调用转换函数和求值函数,输出计算结果。
五、实验代码```cppinclude <iostream>include <stack>include <string>//定义操作符的优先级int priority(char op) {if (op =='+'|| op =='')return 1;if (op ==''|| op =='/')return 2;return 0;}//中缀表达式转后缀表达式std::string infixToPostfix(std::string infix) {std::stack<char> opStack;std::string postfix ="";for (char c : infix) {if (isdigit(c)){postfix += c;} else if (c =='('){} else if (c ==')'){while (!opStackempty()&& opStacktop()!='('){postfix += opStacktop();opStackpop();}opStackpop();//弹出'('} else {while (!opStackempty()&& priority(opStacktop())>=priority(c)){postfix += opStacktop();opStackpop();}opStackpush(c);}}while (!opStackempty()){postfix += opStacktop();}return postfix;}//后缀表达式求值int evaluatePostfix(std::string postfix) {std::stack<int> operandStack;for (char c : postfix) {if (isdigit(c)){operandStackpush(c '0');} else {int operand2 = operandStacktop();operandStackpop();int operand1 = operandStacktop();operandStackpop();switch (c) {case '+':operandStackpush(operand1 + operand2);break;case '':operandStackpush(operand1 operand2);break;case '':operandStackpush(operand1 operand2);break;case '/':operandStackpush(operand1 / operand2);break;}}}return operandStacktop();}int main(){std::string infixExpression;std::cout <<"请输入中缀表达式: ";std::cin >> infixExpression;std::string postfixExpression = infixToPostfix(infixExpression);int result = evaluatePostfix(postfixExpression);std::cout <<"表达式的计算结果为: "<< result << std::endl;return 0;}```六、实验结果输入不同的中缀表达式,如“2 +3 4”“( 2 + 3 )4”等,程序能够正确地将其转换为后缀表达式,并计算出结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
21+23*(12-6)
后缀表达式为:
21 23 12 6 -*+
计算结果是159
2.请输入四则运算表达式:
4/5+4-5
后缀表达式为:
4 5 / 4 + 5 -
计算结果是-0.2
3.请输入四则运算表达式:
1.5+4/5
输入有误{//建立叶子节点并入栈 PTR
i += N.CrtNode(PTR, &exp[i]);
}
else if (exp[i] == ' ')
i++;
else
{
switch (exp[i])
{
case '(': {
OPTR.push(exp[i]);
i++;
break; }
case ')':
{
op = OPTR.top(); OPTR.pop();
5建树过程中构造两个栈S1和S2,S1用来存放节点指针,S2用来存储操作符;遍历表达式时,如果遇到操作数,则建立节点并将其压入栈S1中。遇到操作符则将其压入操作符栈S2中,若栈顶还有操作符则弹出该操作符进行优先度比较,将优先度高的先放入栈中。弹出S2栈顶的操作符,建立节点,并弹出两个S1栈顶的节点,将操作符结点的左右指针域指向它们。直到操作符域为空。
{
N.CrtSubTree(PTR, op);
OPTR.pop();
}
if (exp[i] != '#')
{
OPTR.push(exp[i]);
i++;
}
break;
}
}
}//end else
}//end while
T = PTR.top();
PTR.pop();
}
};
3.算法时空分析
用户输入的表达式存入二叉树的时间复杂度为Ɵ(n),对二叉树的后序遍历的时间复杂度也是Ɵ(n),运算的时间复杂度也是Ɵ(n)。所以总的时间复杂度是Ɵ(n)。
for (i = 0; i < count; i++)
cout << exp[i];
请输入一个四则运算表达式:
21+23*(12-6)
该表达式的后缀表达式为:
21 23 12 6 -*+
运算结果为:
159
5.函数调用关系
创建节点
创建二叉树
连接节点
主程序后序遍历输出二叉树
符数转换
表达式的计算优先级判断
while (op != '(')
{
N. CrtSubTree(PTR, op);
op = OPTR.top(); OPTR.pop();
}
i++;break;
}
default: //exp[i]是 + - * /
while (!OPTR.empty())
{
op = OPTR.top();
if (Precede(op, exp[i]) == '>')
4.输入输出格式
输入:
char ch[100];//字符串数组存储表达式
while (i < 100)
{
scanf_s("%c", &c, 100);
ch[i++] = c;
}
输出:
T->PostOrderTraverse(T, exp, count);//输出后序遍历表达式
cout << "后序遍历表达式为:\n";
Node* left()const{return p1;};//返回左结点
Node* right()const{return p2;};//返回右结点
}
2栈的ADT设计:
class AStck:public Stack<char>//
{
private:
int size;//栈的长度
int top;//栈顶元素
bool push(const Elem&it);//插入元素操作
bool pop(const Elem&it);//删除操作
bool topValue(Elem&it);//获取栈顶元素的值
为了存储中缀表达式,构建一个树的ADT
数据对象D:D是具有相同特性的数据元素的集合
数据关系R:
若D为空集,则称为空树 。否则:
四.调试分析
};
树的ADT设计。用树来存储中缀表达式
class Tree
{
private:
Node *root;
public:
Tree()
{
root = NULL;
}
~Tree(){ delete[]root; }
void insert(BiTree &T,char exp[])
{
//插入
stack <BiTree> PTR;//存放表达式树中的节点指针
4为了计算中缀表达式的值,通过定义一个栈来计算。栈的ADT设计如下:
数据对象:D={ ai| ai∈ElemSet, i=1,2,...,n, n≥0 }
数据关系:R1={ <ai-1, ai>| ai-1, ai∈D, i=2,...,n }
(约定an端为栈顶,a1端为栈底。)
基本操作:
void clear();//初始化操作
Node *p1;//指向左子节点的指针
Node *p2;//指向右子节点的指针
public:
int val(){return data;};//返回结点的数值
void setLeft(Node*it){p1=it;}; //设置左结点
void setRight(Node*it){p2=it};//设置右结点
(1)在D中存在唯一的称为根的数据元素root;
(2)当n>1时,其余结点可分为m (m>0)个互不相交的有限集T1, T2, …, Tm,其中每一棵子集本身又是一棵符合本定义的树,称为根root的子树。
基本操作:
void insert(const char&);
void clear();
算法基本思想
HUNANUNIVERSITY
课程实验报告
题目:四则运算表达式求值
学生姓名:
学生学号:
专业班级:
指导老师:
完成日期:
一.需求分析
1.输入形式
用户需输入一个中缀表达式,用户需输入四则运算符.括号和数字回车表示结束才,如:(3+4)*5/3。当用户输入错误的符号时,提示用户输入有误,并重新输入。具体格式:
3求后缀表达式值时再构造一个栈S用来存放操作数。因为在定义数据类型的时候,要存储操作符,所以操作数也是用char类型存储的。后序遍历到操作数是需要将其转换为float型并压入栈中。
遍历到操作符时,栈顶两个操作数弹出,进行运算并将结果压入栈中。二叉树遍历完毕且栈中仅有一个元素,则计算完成,最后输出该结果即可。
Elem*listArray;//顺序表保存栈元素
public:
AStack(int sz)
{size=sz;top=0;listArray=newCar[sz];}//构造函数
~AStack(){delete []listArray;}//析构函数
void clear(){top=0;}//栈的清空
stack <char> OPTR;//存放操作符
char op;
Node N;
int i = 0;
OPTR.push('#');
op = OPTR.top();
while (!((exp[i] == '#') && (OPTR.top() == '#')))
{
if (IsDigital(exp[i]))
item=listArray[-top];returntrue;
}
}//栈的删除
bool topValue(char& it) const
{
if(top==0)return false;
else
{it=listArray[top-1]; return true;}
}//获取栈顶元素
int length()const {return top;} //栈的长度
while (op != '(')
{
N. CrtSubTree(PTR, op);
op = OPTR.top(); OPTR.pop();
}
i++;break;
}
default: //exp[i]是 + - * /
while (!OPTR.empty())
{
op = OPTR.top();
if (Precede(op, exp[i]) == '>')
{//建立叶子节点并入栈 PTR
i += N.CrtNode(PTR, &exp[i]);
}
else if (exp[i] == ' ')
i++;
else
{
switch (exp[i])
{
case '(': {
OPTR.push(exp[i]);
i++;