数据结构课程设计_实验报告(一)表达式求值(计算器)
数据结构课程设计-计算器

数据结构课程设计-计算器数据结构课程设计计算器在计算机科学的学习中,数据结构是一门重要的基础课程。
通过这门课程的学习,我们能够深入理解和掌握如何有效地组织和管理数据,以提高程序的运行效率和性能。
本次课程设计的任务是开发一个简单的计算器程序,通过运用所学的数据结构知识,实现基本的算术运算功能。
一、需求分析首先,我们需要明确计算器程序的功能需求。
这个计算器应该能够支持常见的四则运算,即加法、减法、乘法和除法。
用户可以通过输入表达式,例如“2 +3”、“5 2”、“3 4”、“8 /2”等,程序能够正确计算并输出结果。
此外,为了提高用户体验,计算器还应该能够处理错误输入,例如输入的表达式不符合语法规则或者除数为 0 等情况,并给出相应的错误提示信息。
二、数据结构选择为了实现上述功能,我们需要选择合适的数据结构来存储和处理输入的表达式。
在这个计算器程序中,我们可以使用栈这种数据结构。
栈是一种后进先出(Last In First Out,LIFO)的数据结构,非常适合处理表达式的计算。
我们可以创建两个栈,一个用于存储操作数,另一个用于存储操作符。
当用户输入一个表达式时,我们按照从左到右的顺序逐个字符进行处理。
如果是数字,则将其转换为整数并压入操作数栈;如果是操作符,则将其压入操作符栈。
在计算过程中,我们从操作符栈中取出操作符,从操作数栈中取出相应数量的操作数进行计算,将计算结果压回操作数栈。
三、算法设计1、表达式解析算法从左到右扫描表达式。
如果遇到数字,将其作为一个整数提取出来,并压入操作数栈。
如果遇到操作符(+、、、/),则将其压入操作符栈。
如果遇到左括号“(”,则将其压入操作符栈。
如果遇到右括号“)”,则从操作符栈中弹出操作符,从操作数栈中弹出操作数,进行计算,直到遇到左括号为止。
2、计算算法当操作符栈不为空时,从操作符栈中弹出一个操作符。
根据操作符的类型,从操作数栈中弹出相应数量的操作数。
进行计算,并将结果压回操作数栈。
数据结构计算器(包括中缀转换后缀)课程设计报告

课程设计报告题目:计算表达式的值1.问题描述对于给定的一个表达式,表达式中可以包括常数、算术运行符(“+”、“-”、“*”、“/”)和括号,编写程序计算表达式的值。
基本要求:从键盘输入一个正确的中缀表达式,将中缀表达式转换为对应的后缀表达式,并计算后缀表达式的值。
对于表达式中的简单错误,能够给出提示,并给出错误信息;表达式中可以包括单个字母表示的变量。
测试数据:任意选取一个符合题目要求的表达式。
提高要求:(1)能够处理多种操作符。
(2)实现包含简单运算的计算器。
(3)实现一个包含简单运算和函数运算的计算器。
2.需求分析(1)软件的基本功能本软件实在win32工程下实现的带有界面和图标的功能较为齐全的计算器。
此计算器分三个方面进行计算,分别为数值表达式的计算,字母表达式的计算和函数计算。
可由键盘或用鼠标点击按键输入带有数字或字母的中缀表达式,程序可以将输入的带有数字或字母的中缀表达式转换成对应的后缀表达式,并计算只含有数字的后缀表达式的值。
本软件支持含小数、多位数等多种操作数的处理,可以计算含加、减、乘、除、百分号、求余、求幂,求阶乘,求三角函数的值等多种运算符和函数的表达式(2)输入/输出形式用户可通过打开图标弹出来的计算器界面任意点击操作。
对于在输入时发生的简单错误,软件通过弹出对话框给出提示并且在提示错误的同时自动将用户的出错输入略去转化成正确的表达式进行计算,用户也可选择清楚操作然后重新输入a.对于数值和函数表达式软件会输出其表达式的后缀表达式和计算结果并保留六位小数;b.对于字母表达式因字母无法进行数值运算,软件仅输出其后缀表达式的值;清楚按钮可以清楚有已经输入或输出的数据从头计算;软件窗口可实现最小化。
并且输入编辑框可进行修改,复制,粘贴等操作,但后缀表达式和求值结果的编辑框中的内容不可修改,只能执行复制操作。
(3)测试数据要求用户可以输入一个符合要求的中缀表达式,也可以输入一个包含简单错误的表达式。
数据结构课程设计算术表达式求值-计算器(Word)

高级语言程序设计《算术表达式求值》课程设计报告算术表达式求值系统可以实现实现对算术四则混合运算表达式求值,并打印求值过程中运算符栈、操作数栈的变化过程。
第二章系统分析开始运行时界面如下:你可以输入一个表达式,按E对其进行求值。
#include <stdio.h>#include <conio.h>#include <stdlib.h>#include <string.h>#define N 100double numStack[N]={0};//操作数栈int numTop;char opStack[N];//运算符栈int opTop;void print_num(double str1[],int n) {int i;printf("\n操作数栈:\n");for(i=0;i<n;i++)printf("%g ",str1[i]);}void print_op(char str2[],int m) {int j;printf("\n运算符栈:\n");for(j=0;j<m;j++)printf("%c ",str2[j]);}int op(char ch)//判断运算符优先级{if(ch=='+'||ch=='-') return 2;if(ch=='*'||ch=='/') return 3;if(ch=='(') return -1;return 0;}double result(double num1,char op,double num2)//计算{if(op=='+') return num1+num2;if(op=='-') return num1-num2;if(op=='*') return num1*num2;if(op=='/') return num1/num2;return 0;}int compute(char str[]){double num=0;int i=0,j=1,k=1;numTop=opTop=0;while(str[i]!='\0'||opTop>0){if(str[i]>='0'&&str[i]<='9')num=num*10+str[i]-'0';else if( k==1&&str[i]=='-'&&(i==0||op(str[i-1])) )k=-1;else{if(i>0&&!op(str[i-1])&&str[i]!='('&&str[i-1]!=')') {numStack[numTop++]=num*k;if(opTop!=0&&numTop!=0)print_num(numStack,numTop);num=0; j=1; k=1;}if(opTop==0||str[i]=='('){opStack[opTop++]=str[i];print_op(opStack,opTop);}else if(str[i]==')'){while(opTop>0&&opStack[--opTop]!='('){numStack[numTop-2]=result(numStack[numTop-2],opStack[opTop],numStack[numTop-1]);if(opTop!=0&&numTop!=0){print_num(numStack,numTop);print_op(opStack,opTop);}numTop--;}if(opStack[opTop]!='(') return 0;}else{if(str[i]=='\0'&&numTop==0) return 0;while(opTop>0&&op(str[i])<=op(opStack[opTop-1])){numStack[numTop-2]=result(numStack[numTop-2],opStack[--opTop],numStack[numTop-1]);if(opTop!=0&&numTop!=0){print_num(numStack,numTop-1); print_op(opStack,opTop);}numTop--;}if(str[i]!='\0')opStack[opTop++]=str[i];if(opTop!=0&&numTop!=0)print_op(opStack,opTop);}}if(str[i]!='\0')i++;}if(numTop!=1||opTop!=0)return 0;return 1;}void menu(){system("cls");printf("_______________________________\n");printf(" Clear(C) | Equal(E) | Quit(Q) \n");printf("-------------------------------\n");}int main(void){int i=0,j=0,k;char str[N]="\0";char num[N]="\0";char save[N]="\0";char ch;double temp;unsigned long temp2;menu();printf("input an expression,press key 'E' to compute\n");ch=getch();while( 1 ){if(ch==')'||op(ch)||ch>='0'&&ch<='9'){str[i++]=ch;str[i]='\0';menu();printf("input an expression,press key 'E' to compute\n"); printf("%s",str);if( ch=='-'&&(i==1||op(str[i-2]))||ch>='0'&&ch<='9' ){num[j++]=ch;num[j]='\0';}elsej=0;}if(ch=='C'||ch=='c'){if(strlen(str))str[--i]='\0';menu();printf("input an expression,press key 'E' to compute\n");printf("%s",str);}if(ch=='E'||ch=='e'){if(compute(str)){printf("\n=%g\n",numStack[0]); j=0; temp=numStack[0];if(temp<0){temp=-temp;num[j++]='-';num[j]='\0';}temp2=(unsigned long)temp;k=1;while(temp2/k>=10) k*=10;while(k){num[j++]=temp2/k+'0';num[j]='\0';temp2=temp2%k;k/=10;}temp=temp-(int)temp;if(temp!=0){num[j++]='.';num[j]='\0';temp+=0.0000005;}for(k=6;k>0;k--){if(temp==0) break;temp*=10;num[j++]=(int)temp+'0';num[j]='\0';temp=temp-(int)temp;}}i=0; j=0; str[0]='\0';}if(ch=='Q'||ch=='q'){printf("\nare you sure to quit?(Y/N)\n");ch=getch();if(ch=='Y'||ch=='y') break;else{menu();printf("input an expression,press key 'E' to compute\n");printf("%s",str);}}ch=getch();}return 0;}第五章系统测试1.先输入: 3+2*5 后按E求值2.再输入:12/4-5 后按E求值3.再输入Q4.输入Y,退出系统。
数据结构课程设计-实验报告(一)表达式求值(计算器)

数据结构课程设计实验报告(一)表达式求值(计算器)数据结构课程设计实验报告起止时间:2015.12.28-2015.12.311、输入:tan452、输出:13、执行结果::设计过程中遇到的问题及解决办法:问题:算数表达式以字符串输入,操作数和操作符的提取;解决办法:两两操作符之间如有数字将中间的数字提取强制转换成double型;参考文献:(在设计中参考的书籍、网站等资料)1. 朱振元,《数据结构——C++语言描述》,清华大学出版社,2008年,页码:2./doc/76dd2d95ec630b1c59eef8c75fbfc77da26997be.htm l /detail/gszhouyi/738777指导老师评议:成绩评定:指导教师签名:附件:(程序源代码)#include#include#include#include#define N 100#define pai 3.1415926typedef struct yxj{char operat;int rank;}yxj;typedef struct strchar 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]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]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]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||str cmp(data,"/")==0 ||strcmp(data,"^")==0||strcmp(data,"=")==0){printf("格式错误\n");return;}Len=strlen(data);numb[0]=0;for(i=0;izhan[i].data[0]='\0';for(i=0;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];jif(data[j]>='0'&&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;jif(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]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");}}-全文完-。
数据结构计算器实验报告

数据结构计算器实验报告1. 引言数据结构是计算机科学的基础,它提供了一种组织和存储数据的方式,以便能够高效地访问和操作这些数据。
计算器是一种常见的应用程序,它可以执行各种数学运算。
本实验的主要目的是设计和实现一个简单的数据结构计算器,用于实现基本的四则运算功能。
2. 设计思路在设计数据结构计算器时,我们需要考虑以下几个方面的问题:2.1 数据结构选择为了实现四则运算功能,我们首先需要选择合适的数据结构来存储和操作数学表达式。
在本实验中,我们选择使用栈作为数据结构,因为栈具有后进先出的特性,非常适合处理运算符和操作数的顺序。
2.2 表达式解析在计算器中,我们需要将用户输入的数学表达式解析成运算符和操作数,以便进行计算。
为了实现表达式解析功能,我们可以使用字符串的分割和转换操作来提取运算符和操作数,并将它们存储到栈中。
2.3 运算符优先级在进行四则运算时,运算符的优先级非常重要。
我们需要确保高优先级的运算符先于低优先级的运算符进行计算。
为了实现这一功能,我们可以使用栈来存储运算符,并在遇到运算符时进行比较和计算。
2.4 计算结果输出最后,我们需要将计算结果输出给用户。
为了实现这一功能,我们可以使用一个变量来存储计算结果,并在计算完成后将结果输出到屏幕上。
3. 实现步骤基于上述设计思路,我们可以按照以下步骤来实现数据结构计算器:3.1 定义栈数据结构首先,我们需要定义一个栈数据结构来存储运算符和操作数。
栈可以使用数组或链表来实现,具体选择取决于实际需求。
3.2 解析数学表达式接下来,我们需要编写代码来解析用户输入的数学表达式。
我们可以使用字符串的分割和转换操作来提取运算符和操作数,并将它们存储到栈中。
3.3 实现运算符优先级比较和计算在解析数学表达式的过程中,我们需要实现运算符的优先级比较和计算功能。
每当遇到一个运算符时,我们可以将其与栈顶的运算符进行比较,如果栈顶的运算符优先级较高,则可以进行相应的计算。
数据结构计算器实验报告

数据结构计算器实验报告数据结构计算器实验报告引言:数据结构是计算机科学中非常重要的一门课程,它研究了数据的组织、存储和管理方式,以及对数据进行操作和处理的算法和技术。
在本次实验中,我们设计了一个基于数据结构的计算器,旨在通过实践应用数据结构的知识,提高我们的编程能力和算法思维。
一、设计思路我们的计算器主要有两个功能:进行四则运算和进行括号匹配。
为了实现这两个功能,我们选择了栈这一数据结构。
栈是一种具有后进先出(LIFO)特点的数据结构,非常适合用来处理括号匹配和运算符的优先级。
二、括号匹配算法在进行四则运算之前,我们首先需要对输入的表达式进行括号匹配的检查。
我们使用了一个栈来实现这一功能。
算法的基本思路是,遍历表达式中的每个字符,当遇到左括号时,将其入栈;当遇到右括号时,将栈顶元素出栈,并判断出栈的元素是否与当前右括号匹配。
如果匹配,则继续遍历下一个字符;如果不匹配,则说明表达式存在括号不匹配的错误。
三、四则运算算法当表达式通过了括号匹配的检查后,我们就可以进行四则运算了。
我们使用两个栈来实现这一功能,一个栈用来存储操作数,另一个栈用来存储运算符。
算法的基本思路是,遍历表达式中的每个字符,当遇到数字时,将其入操作数栈;当遇到运算符时,将其入运算符栈,并根据运算符的优先级进行相应的操作。
四、运算符优先级为了正确计算表达式的值,我们需要定义运算符的优先级。
一般来说,乘法和除法的优先级高于加法和减法。
为了实现这一功能,我们可以使用一个优先级表来存储运算符的优先级。
在进行运算时,我们可以通过比较栈顶运算符和当前运算符的优先级来决定是否进行运算。
五、实验结果经过我们的努力,我们成功地实现了一个基于数据结构的计算器。
我们对该计算器进行了多组测试,包括括号匹配、四则运算等不同情况。
在所有的测试中,我们的计算器都能正确地输出结果,并且在处理大规模表达式时也能保持较好的性能。
六、总结与展望通过本次实验,我们深入理解了数据结构的应用和算法的设计。
数据结构课程设计-表达式求值【完整版】

XXXXXX大学《数据结构》课程设计报告班级:学号:姓名:指导老师:目录一算术表达式求值一、需求分析二、程序得主要功能三、程序运行平台四、数据结构五、算法及时间复杂度六、测试用例七、程序源代码二感想体会与总结算术表达式求值一、需求分析一个算术表达式就是由操作数(operand)、运算符(operator)与界限符(delimiter)组成得。
假设操作数就是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号与表达式起始、结束符“#”,如:#(7+15)*(23—28/4)#。
引入表达式起始、结束符就是为了方便.编程利用“算符优先法”求算术表达式得值.二、程序得主要功能(1)从键盘读入一个合法得算术表达式,输出正确得结果。
(2)显示输入序列与栈得变化过程。
三、程序运行平台Visual C++6、0版本四、数据结构本程序得数据结构为栈。
(1)运算符栈部分:struct SqStack //定义栈{char *base; //栈底指针char *top; //栈顶指针intstacksize; //栈得长度};intInitStack (SqStack &s) //建立一个空栈S{if (!(s、base= (char *)malloc(50*sizeof(char))))exit(0);s、top=s、base;s、stacksize=50;return OK;}char GetTop(SqStack s,char &e) //运算符取栈顶元素{if (s、top==s、base) //栈为空得时候返回ERROR{ﻩ printf("运算符栈为空!\n");ﻩ return ERROR;}elsee=*(s、top-1); //栈不为空得时候用e做返回值,返回S得栈顶元素,并返回OK returnOK;}int Push(SqStack&s,char e) //运算符入栈{if (s、top—s、base >= s、stacksize)ﻩ{printf("运算符栈满!\n");ﻩs、base=(char*)realloc(s、base,(s、stacksize+5)*sizeof(char));//栈满得时候,追加5个存储空间if(!s、base)exit (OVERFLOW);s、top=s、base+s、stacksize;s、stacksize+=5;}ﻩ*(s、top)++=e;//把e入栈ﻩreturn OK;}int Pop(SqStack &s,char &e) //运算符出栈{if (s、top==s、base) //栈为空栈得时候,返回ERROR{printf("运算符栈为空!\n”);ﻩ return ERROR;}else{ﻩﻩe=*-—s、top;//栈不为空得时候用e做返回值,删除S得栈顶元素,并返回OK return OK;}}int StackTraverse(SqStack&s)//运算符栈得遍历{ﻩchar *t;ﻩt=s、base;ﻩif (s、top==s、base){ﻩ printf(”运算符栈为空!\n”); //栈为空栈得时候返回ERRORreturn ERROR;}while(t!=s、top){ﻩﻩprintf(" %c",*t); //栈不为空得时候依次取出栈内元素t++;ﻩ}return ERROR;}(2)数字栈部分:struct SqStackn//定义数栈{int *base; //栈底指针int*top; //栈顶指针int stacksize; //栈得长度};intInitStackn (SqStackn &s) //建立一个空栈S{s、base=(int*)malloc(50*sizeof(int));if(!s、base)exit(OVERFLOW);//存储分配失败s、top=s、base;s、stacksize=50;return OK;}int GetTopn(SqStackn s,int&e) //数栈取栈顶元素{if(s、top==s、base){printf("运算数栈为空!\n");//栈为空得时候返回ERRORﻩ return ERROR;}elseﻩe=*(s、top-1);//栈不为空得时候,用e作返回值,返回S得栈顶元素,并返回OKreturnOK;}int Pushn(SqStackn &s,int e) //数栈入栈{if(s、top—s、base>=s、stacksize){ﻩﻩprintf("运算数栈满!\n");//栈满得时候,追加5个存储空间ﻩs、base=(int*)realloc (s、base,(s、stacksize+5)*sizeof(int));if(!s、base) exit (OVERFLOW);ﻩs、top=s、base+s、stacksize;//插入元素e为新得栈顶元素s、stacksize+=5;}*(s、top)++=e; //栈顶指针变化returnOK;}int Popn(SqStackn &s,int &e)//数栈出栈{ﻩif (s、top==s、base){ﻩ printf("运算符栈为空!\n");//栈为空栈得视时候,返回ERRORﻩ return ERROR;ﻩ}else{ﻩﻩe=*—-s、top;//栈不空得时候,则删除S得栈顶元素,用e返回其值,并返回OK ﻩreturnOK;}}int StackTraversen(SqStackn &s)//数栈遍历{ﻩint*t;ﻩt=s、base ;ﻩif(s、top==s、base)ﻩ{printf("运算数栈为空!\n”);//栈为空栈得时候返回ERRORﻩ return ERROR;ﻩ}ﻩwhile(t!=s、top)ﻩ{printf(” %d”,*t); //栈不为空得时候依次输出t++;}return ERROR;}五、算法及时间复杂度1、算法:建立两个不同类型得空栈,先把一个‘#’压入运算符栈。
数据结构表达式求值实验报告

数据结构表达式求值实验报告数据结构表达式求值实验报告⒈引言本实验旨在研究和实现数据结构中表达式求值的算法。
表达式求值是计算机科学中常见的问题,对于计算机程序的正确性和性能具有重要影响。
本报告将详细介绍实验设计、实验步骤、实验结果及分析,并对实验过程中遇到的问题进行讨论。
⒉实验设计⑴实验目的本实验的目的是实现一个可以对常见的算术表达式进行求值的算法,包括支持基本的加减乘除运算符和括号。
⑵实验环境●操作系统:Windows 10●开发语言:C++●开发工具:Visual Studio 2019⑶数据结构设计为了实现表达式求值的算法,我们需要设计适当的数据结构来存储和处理表达式。
本实验中,我们选择使用栈来实现表达式求值。
●表达式栈:用于存储操作数和运算符。
●运算符栈:用于存储运算符。
⑷算法设计表达式求值的算法可以分为以下几个步骤:●遍历表达式,逐个处理操作数和运算符:●如果是操作数,入表达式栈。
●如果是运算符,与运算符栈栈顶元素进行比较,根据优先级决定如何处理。
●当表达式遍历完成后,依次处理剩余的运算符。
●最终表达式栈中的元素即为求值结果。
⒊实验步骤⑴数据结构实现根据设计,我们首先实现表达式栈和运算符栈的数据结构,包括入栈、出栈等操作。
⑵表达式输入与预处理用户输入待求值的表达式,进行预处理,去除空格、验证表达式的合法性等。
⑶表达式求值算法实现根据前述的算法设计,实现表达式求值的算法,利用表达式栈和运算符栈来处理表达式。
⑷测试与结果分析对于不同的测试用例,进行表达式求值的测试,并分析结果的正确性和性能。
⒋实验结果与分析经过实验测试,我们得到了表达式求值的结果。
结果显示,我们的算法能够正确地求得表达式的值,而且性能良好。
⒌讨论与总结在实验过程中,我们遇到了一些问题,并进行了讨论和解决。
通过这个实验,我们更加深入地理解了表达式求值的算法,并对数据结构的应用有了更清晰的认识。
附件:无法律名词及注释:●无。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计实验报告起止时间: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");}}。