数据结构课程设计:算术表达式

合集下载

算术表达式的求解-数据结构课程设计报告

算术表达式的求解-数据结构课程设计报告

课程设计报告题目:算术表达式求值一、需求分析1、设计要求:给定一个算术表达式,通过程序求出最后的结果1>、从键盘输入要求解的算术表达式;2>、采用栈结构进行算术表达式的求解过程;3>、能够判断算术表达式正确与否;4>、对于错误表达式给出提示;5>、对于正确的表达式给出最后的结果;2、设计构想:为了实现算符优先算法使用两个工作栈,一个称作OPTR,以寄存运算符;另一个称作OPND,用以寄存操作数或运算结果。

在操作数和操作符入栈前,通过一个函数来判别,输入的是操作数还是操作符,操作数入OPND,操作符入OPTR。

在输入表达式的最后输入‘#’,设定‘#’的优先级最低,代表表达式输入结束。

在表达式输入过程中,遇操作数则直接入栈,遇到运算符则与栈顶运算符比较优先级,若当前运算符优先级高,则当前运算符入栈,扫描下一符号;否则栈顶运算符出栈,两操作数出栈,进行运算,所得结果入数栈,重新比较当前运算符与新栈顶运算符。

如此重复直到栈顶运算符与当前符号均为‘#’,运算结束。

二、概要设计1、本程序包含的模块:(1)栈模块——实现栈抽象数据类型(2)运算模块——实现数据表达式的运算(3)主程序模块三、详细设计(1)栈模块1、定义栈结构struct Sqstack{elemtype *top;//栈顶元素elemtype *base; //栈底元素int stacksize;//栈的大小};2、栈的基本操作①初始化栈status initstack(struct Sqstack &s){s.base=(elemtype *)malloc(stack_size*sizeof(elemtype)); if(!s.base)return OVERFLOW;s.top=s.base;s.stacksize=stack_size;return OK;}②入栈status push(struct Sqstack &s,elemtype e){if(s.top-s.base>=s.stacksize){s.base=(elemtype*)realloc(s.base,(s.stacksize+stack_increase ment)*sizeof(elemtype));if(!(s.base))return OVERFLOW;s.top=s.base+s.stacksize;s.stacksize+=stack_increasement;}* s.top++=e;return OK;}③出栈elemtype pop(struct Sqstack &s){elemtype e;if(s.top= =s.base)return ERROR;e=*--s.top;return e;}④取栈顶元素elemtype gettop(struct Sqstack &s){elemtype e;if(s.top==s.base)return ERROR;e=*(s.top-1);return e;}(2)运算模块1、判断输入字符c是否为操作符:若是,则返回1;否则,返回0int In(int c){char p[10]="+-*/()#^";int i=0;while(p[i]!='\0'){if(p[i]==c)return 1;i++;}return 0;}2、判断运算符的优先级char precede(char top,char c)//该函数为判断当前运算符与前一个运算符的优先级,前一个运算符高于或等于当前运算符的优先级则返回‘>’,前一个运算符小于当前运算符的优先级则返‘<’,当前一个运算符为‘(’当前运算符为‘)’时返回‘=’,用于去除表达式的括号。

数据结构课程设计(算术表达式求值)-计算器

数据结构课程设计(算术表达式求值)-计算器

高级语言程序设计《算术表达式求值》课程设计报告算术表达式求值系统可以实现实现对算术四则混合运算表达式求值,并打印求值过程中运算符栈、操作数栈的变化过程。

第二章系统分析开始运行时界面如下:你可以输入一个表达式,按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,退出系统。

数据结构——算术表达式求值算法.doc

数据结构——算术表达式求值算法.doc

数据结构——算术表达式求值算法.沈阳航空航天大学课程设计报告课程设计名称:数据结构课程设计课程设计题目:算术表达式求值算法院(系):计算机学院专业:计算机科学与技术班级:学号:姓名:指导教师:丁国辉完成日期:XXXX年01月11日word教育资料.目录第1章概要设计11.1题目的内容与要求11.2总体结构1第2章详细设计32.1栈的顺序存储模块32.2进栈模块32.3出栈模块42.4运算模块42.5判断优先级模块52.6处理表达式主体模块6第3章调试分析8第4章运行结果9参考文献11附录(程序清单)12word教育资料.第1章概要设计1.1题目的内容与要求内容:设计程序,其能够求解任意给定算数表达式的值,算数表达式中的操作符来自于集合{+,-,*,\},表达式允许包括小括号“()”,表达式的输入以“#”作为结束标志。

要求:1) 利用栈结构实现表达式求值算法,即在约定的条件下,正确输入表达式,经过程序的运行之后,给出表达式的值;2) 系统利用C语言实现;3) 独立完成系统的设计、编码和调试。

1.2总体结构本程序主要分为六个模块(主要算法模块图见图1.1):栈的顺序存储模块、进栈模块、出栈模块、运算模块、判断优先级模块、处理表达式主体模块。

栈的顺序存储模块:分别建立两个栈,第一个用来存储运算符,第二个是用来存储数字。

进栈模块:运算符和数字分别存储在运算符栈和数字栈中,以便运算时的调用。

出栈模块:由于运算的需要,就必须把运算符和数字分别从运算符栈和数字栈中取出来。

运算模块:程序在遇到运算符的时候,根据此模块的要求进行运算。

判断优先级模块:找出栈顶算符和即将入栈算符的对应的下标,然后根据算符间的优先关系表判断出算符的优先关系。

处理表达式主体模块:结合运算模块和判断优先级模块,对表达式进行系统处理,求出算数表达式的值。

算术表达式求值算法出栈模块判断优先级模块处理表达式主体模块栈的顺序存储模块运算模块进栈模块图 1.1 主要算法模块图.第2章详细设计在本次课程设计中,我们用到了栈这个重要的数据结构。

算术表达式的求解-数据结构课程设计报告

算术表达式的求解-数据结构课程设计报告

算术表达式的求解-数据结构课程设计报告课程设计报告题目:算术表达式求值一、需求分析 1、设计要求:给定一个算术表达式,通过程序求出最后的结果 1>、从键盘输入要求解的算术表达式; 2>、采用栈结构进行算术表达式的求解过程; 3>、能够判断算术表达式正确与否;4>、对于错误表达式给出提示;5>、对于正确的表达式给出最后的结果; 2、设计构想:为了实现算符优先算法使用两个工作栈,一个称作OPTR,以寄存运算符;另一个称作OPND,用以寄存操作数或运算结果。

在操作数和操作符入栈前,通过一个函数来判别,输入的是操作数还是操作符,操作数入OPND,操作符入OPTR。

在输入表达式的最后输入‘#’,设定‘#’的优先级最低,代表表达式输入结束。

在表达式输入过程中,遇操作数则直接入栈,遇到运算符则与栈顶运算符比较优先级,若当前运算符优先级高,则当前运算符入栈,扫描下一符号;否则栈顶运算符出栈,两操作数出栈,进行运算,所得结果入数栈,重新比较当前运算符与新栈顶运算符。

如此重复直到栈顶运算符与当前符号均为‘#’,运算结束。

二、概要设计1、本程序包含的模块:栈模块——实现栈抽象数据类型运算模块——实现数据表达式的运算主程序模块算术运算式的求解栈模块主函数模块main 运算模块定义栈结构初始化栈出栈入栈取栈顶元素判断输入字符类型判断符号优先级基础运算函数运算函数三、详细设计栈模块1、定义栈结构 struct Sqstack{elemtype *top;//栈顶元素 elemtype *base; //栈底元素 int stacksize;//栈的大小 };2、栈的基本操作①初始化栈status initstack(struct Sqstack &s) {=(elemtype *)malloc(stack_size*sizeof(elemtype)); if(!) return OVERFLOW; =;=stack_size; return OK; } ②入栈status push(struct Sqstack &s,elemtype e) {if(>=) {=(elemtype*)realloc(,(+stack_increasement)*sizeof(elemtype));if(! ) return OVERFLOW; =+; +=stack_increasement; } * ++=e; return OK; } ③出栈elemtype pop(struct Sqstack &s) {elemtype e; if(= =) return ERROR; e=*--;return e; }④取栈顶元素elemtype gettop(struct Sqstack &s) {elemtype e; if(==) return ERROR; e=* ; return e; } 运算模块1、判断输入字符c是否为操作符:若是,则返回1;否则,返回0 int In(int c) {char p[10]=\ int i=0;while(p[i]!='\\0') {if(p[i]==c) return 1;i++; } return 0; }2、判断运算符的优先级char precede(char top,char c)//该函数为判断当前运算符与前一个运算符的优先级,前一个运算符高于或等于当前运算符的优先级则返回‘>’,前一个运算符小于当前运算符的优先级则返‘'; break; case '+': case '-':if(top=='#'||top=='(')result=''; break; case '*': case '/':if(top=='*'||top=='/'||top=='^') result='>'; elseresult=''; elseresult=''; break;case '(': result='': theta=pop(optr); b=pop(opnd); a=pop(opnd); push(opnd,operate(a,theta,b)); break;// 若当前操作符的优先级低于操作符栈的栈顶元素,则将操作符栈栈顶元素出栈,并将操作数栈的栈顶两个元素出栈,计算两个元素间以操作符栈栈顶元素为运算符的数学运算}//switch }//if}//whilereturn pop(opnd); }主程序模块1、main函数void main(int argc,char *argv) {struct Sqstack opnd; //操作数栈 struct Sqstack optr;//操作符栈initstack(opdn); initstack(optr); elemtype result;printf(\ printf(\算术运算式的求解\printf(\ printf(\请输入算术运算表达式(以'#'结尾):\\n\ printf(\result=evaluate(opnd,optr);printf(\printf(\运算的结果是 :\\n \\n%d\\n\printf(\}四、调试分析 1、测试结果1> 测试数据:3+7*2-1# 测试结果:2> 测试数据:(3+7)*2-1# 测试结果:3> 测试数据: 1/0# 测试结果:2、程序时间复杂度为O;3、设计中出现的问题:在开始的设计中没有注意除数不能为0 ,后来加入if(b==0) {printf(\分母为0,the result is error\\n\ result=0; } elseresult=a/b;break;来判断除数是否为0 4、算法改进:1>输入的操作数和操作码于是字符串类型的,在原设计中实现的操作都是对个位数实现的,实用性不大,故在后来的设计中,通过一个标志flag实现了标志操作数的连续输入的判别,继而实现了多位数的表达式运算2>开始只实现了加、减、乘、除及带小括号的数学运算,考虑到实用性,在后来的设计中引入pow函数,实现了乘方的运算,调整结果如下:3>最初设计的运行界面过于单调,不够友好,改进时加入一些*调整调整结果如下:五、课程设计总结本学期是我第一次接触课程设计,发现了很多学习上的问题,也有很多收获。

数据结构课程设计- 算术表达式求值

数据结构课程设计- 算术表达式求值

课程设计报告课程名称数据结构课程设计题目算术表达式求值指导教师设计起始日期 4.18~4.25学院计算机学院系别计算机科学与工程学生姓名班级/学号成绩一、需求分析设计一个算术表达式四则运算的程序,要求完成包括加、减、乘、除运算,包含括号的基本整数表达式的运算。

在这里运算数可以1位长度,也可以多位长度。

在运算之后输出的正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。

(1)输入:3*(7-2)(2)输出:数据栈栈顶元素:3,7,2,7,5,3,15结果:15(3)自选数据二、概要设计1、使用栈的数据结构表示数据的存储。

2、设计算法将中缀表达式转换成后缀表达式,用栈的数据结构实现表达式的运算。

3、把中缀表达式转换为后缀表达式算法的基本思路是从头到尾地扫描中缀表达式中的每个字符,对于不同类型的字符按不情况进行处理。

三、详细设计数据结构:字符类型栈/* 定义字符类型栈*/typedef struct{char stackname[20];char *base;char *top;} Stack;算法:将中缀表达式转换为后缀表达式void Change(char* s1, char* s2)// 将字符串s1中的中缀表达式转换为存于字符串s2中的后缀表达式{Stack R; // 定义用于暂存运算符的栈InitStack(R); // 初始化栈Push(R,'#'); // 给栈底放入’#’字符,它具有最低优先级0int i,j;i=0; // 用于指示扫描s1串中字符的位置,初值为0j=0; // 用于指示s2串中待存字符的位置,初值为0char ch=s1[i]; // ch保存s1串中扫描到的字符,初值为第一个字符while( ch!='#'){ // 顺序处理中缀表达式中的每个字符if(ch==' ')// 对于空格字符不做任何处理,顺序读取下一个字符ch=s1[++i];else if(ch=='('){ // 对于左括号,直接进栈Push(R,ch);ch=s1[++i];}else if(ch==')'){ // 对于右括号,使括号内的仍停留在栈中的运算符依次// 出栈并写入到s2中while(Peek(R)!='(')s2[j++]=Pop(R);Pop(R); // 删除栈顶的左括号ch=s1[++i];}else if(ch=='+'||ch=='-'||ch=='*'||ch=='/'){ // 对于四则运算符,使暂存在栈中的不低于ch优先级// 的运算符依次出栈并写入到s2中char w=Peek(R);while(Precedence(w)>=Precedence(ch)){ // Precedence(w)函数返回运算符形参的优先级s2[j++]=w;Pop(R); w=Peek(R); }}四、调试分析调试:在设计过程中出现程序不能运行,发现不能找到结束标识符,因此在设计的时候需要人为动态添加结束标识符‘#’,顺利运行算法时间和空间分析:算法的运行时间主要花在while循环上,它从头到尾扫描后缀表达式中的每一个数据(每个操作数或运算符均为一个数据),若后缀表达式由n个数据组成,则此算法的时间复杂度为O(n)。

数据结构课程设计:算术表达式

数据结构课程设计:算术表达式

数据结构课程设计:算术表达式表达式求值⼀⽬的利⽤《数据结构》课程的相关知识完成⼀个具有⼀定难度的综合设计题⽬,利⽤C/C++语⾔进⾏程序设计,并规地完成课程设计报告。

通过课程设计,巩固和加深对线性表、栈、队列、字符串、树、图、查找、排序等理论知识的理解;掌握现实复杂问题的分析建模和解决⽅法(包括问题描述、系统分析、设计建模、代码实现、结果分析等);提⾼利⽤计算机分析解决综合性实际问题的基本能⼒。

设计⼀个程序,演⽰以字符序列的形式输⼊不含变量的实数表达式求值的计算结果⼆需求分析设计⼀个程序,演⽰以字符序列的形式输⼊不含变量的实数表达式求值的计算结果。

对于这个程序我们从输⼊,输出,和功能三⽅⾯来分析。

1.程序输⼊:从键盘上输⼊表达式,⼀个算术表达式,由常量、运算符和括号组成(以字符串形式输⼊,不含变量)。

为了简化,操作数只能为浮点数,操作符为“ +”、“-”、“*”、“/”、“(”、“)”,⽤“#“表⽰结束。

2.程序输出:表达式运算结果,运算符栈、运算数栈、输⼊字符和主要操作变化过程,如运算符栈、运算数栈的出⼊记录,字符出⼊栈的过程,打印出完整的过程。

3.功能要求及说明:从键盘上输⼊表达式。

分析该表达式是否合法(包含分母不能为零的情况):(1)是数字,则判断该数字的合法性。

(2)是规定的运算符,则根据规则进⾏处理。

在处理过程中,将计算该表达式的值。

(3)若是其它字符,则返回错误信息。

若上述处理过程中没有发现错误,则认为该表达式合法,并打印处理结果。

三概要设计1.数据结构的选择:任何⼀个表达式都是由操作符,运算符和界限符组成的。

我们分别⽤顺序栈来寄存表达式的操作数和运算符。

栈是限定于紧仅在表尾进⾏插⼊或删除操作的线性表。

为了实现算符优先算法,可以使⽤两个⼯作栈。

⼀个称做SqStack1,⽤以寄存运算符;另⼀个称做SqStack2,⽤以寄存操作数或运算结果。

⾸先置操作数栈为空栈,表达式起始符“#”作为运算符栈的栈底元素,然后依次读⼊表达式的每个字符,若是操作数则进⼊SqStack2栈,若是运算符则和SqStack1栈的栈顶运算符⽐较优先权后做相应操作,直⾄整个表达式求值完毕。

数据结构课程设计-算术表达式求值的实现

数据结构课程设计-算术表达式求值的实现

课程设计报告课程设计名称:数据结构课程设计课程设计题目:算术表达式求值的实现院(系):*****专业:*****班级:*****学号:*****姓名:*****指导教师:*****目录1 课程设计介绍 (1)1.1课程设计内容 (1)1.2课程设计要求 (1)2 课程设计原理 (2)2.1课设题目粗略分析 (2)2.2原理图介绍 (2)2.2.1 功能模块图 (2)2.2.2 流程图分析 (3)3 数据结构分析 (5)3.1存储结构 (5)3.2算法描述 (5)4 调试与分析 (7)4.1调试过程 (7)4.2程序执行过程 (7)参考文献 (8)附录(关键部分程序清单) (9)1 课程设计介绍1.1 课程设计内容编写算法能够进行整型和实型数的表达式求值,能够根据运算的数据选择正确的运算结果的数据类型,表达式的运算符为:+,—,*,/,(,),且括号可以嵌套。

1.2 课程设计要求1.给出必要的输入、输出信息和提示信息。

2.参考相应的资料,独立完成课程设计任务。

3.交规范课程设计报告和软件代码。

2 课程设计原理2.1 课设题目粗略分析根据课设题目要求,拟将整体程序分为三大模块。

此三个模块相互独立,没有嵌套调用的情况,以下是三个模块的大体分析:1.首先依次定义字符类型栈、整型栈、运算符栈和操作数栈,构造运算符栈和操作数栈,然后运算符、操作数依次入栈。

2. 依次读入表达式,若是操作符即进OPND栈,若是运算符即进OPTR栈。

顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置,base为栈底指针,在顺序栈中,它始终指向栈底,即top=base可作为栈空的标记,每当插入新的栈顶元素时,指针top增1,删除栈顶元素时,指针top减1。

3. 按照运算符的优先级别对表达式进行求值运算。

2.2 原理图介绍该功能模块图介绍了这个程序的主要功能。

2.2.1 功能模块图图2.1功能模块图如图2.1所示,要实现表达式的求值,即必须要实现存储、读取和计算三项功能。

算术表达式的求解-数据结构课程设计报告

算术表达式的求解-数据结构课程设计报告

算术表达式的求解-数据结构课程设计报告数据结构》课程设计报告书题目:算术表达式的求解系别:计算机科学与应用数据结构课程设计目录一、需求分析1、设计要求:本程序需要实现对算术表达式的求解功能,可以支持基本的四则运算,包括加、减、乘、除,同时还需要支持括号的使用。

2、设计构想:我们将使用栈来实现算术表达式的求解。

具体地,我们将把中缀表达式转换为后缀表达式,然后再利用栈来求解后缀表达式。

二、概要设计1、本程序包含的模块:本程序包含两个模块:中缀表达式转后缀表达式模块和后缀表达式求解模块。

三、详细设计1、定义栈结构我们定义一个栈结构,用来存储算术表达式中的运算符和操作数。

具体地,栈中的每个元素都包含两个属性:元素的值和元素的类型。

元素的值可以是一个数字或一个运算符,元素的类型可以是数字或运算符。

我们使用一个数组来实现栈的结构。

为了方便起见,我们还需要定义一些基本的栈操作,如入栈、出栈、判断栈是否为空等。

2、栈的基本操作栈是一种常见的数据结构,具有后进先出(LIFO)的特点。

栈的基本操作包括初始化栈、入栈、出栈、取栈顶元素和运算模块。

1) 初始化栈初始化栈是指将栈的各项属性设置为初始状态。

通常包括将栈顶指针设为-1,表示栈为空。

2) 入栈入栈是指将元素压入栈顶。

入栈操作需要将栈顶指针加1,并将元素存入栈顶位置。

3) 出栈出栈是指将栈顶元素弹出。

出栈操作需要将栈顶元素取出,并将栈顶指针减1.4) 取栈顶元素取栈顶元素是指获取栈顶元素的值,但不将其弹出。

取栈顶元素操作只需要返回栈顶元素的值即可。

5) 运算模块栈可以用于实现各种运算,例如中缀表达式的转换和计算、括号匹配等。

运算模块需要根据具体需求进行设计和实现。

3、判断运算符的优先级在进行中缀表达式的转换和计算时,需要判断运算符的优先级。

通常采用栈来实现这一功能。

具体实现方法是将运算符入栈,当遇到新的运算符时,将其与栈顶运算符进行比较,如果新运算符的优先级高于栈顶运算符,则将其入栈,否则将栈顶运算符弹出并输出,直到新运算符可以入栈为止。

数据结构算术表达式的求解本科学位论文

数据结构算术表达式的求解本科学位论文

滨江学院数据结构课程设计题目算术表达式的求解院系计算机系专业学生姓名学号指导教师李燕二O一六年六月十日目录1.前言 (1)1.1课题内容及要求 (1)1.2选题目的及意义 (1)2.系统分析 (2)2.1问题描述 (2)2.2运算符的优先级分析: (2)2.3错误提示分析: (2)3.系统概要设计 (3)3.1系统总体架构设计 (3)3.2系统模块的设计 (3)4.系统详细设计 (4)4.1数据的存储设计与描述: (4)4.2详细的优先级关系: (4)4.3具体的操作集合: (4)5.程序实现 (6)6.程序测试 (13)6.1正确的结果 (13)6.2错误1 (13)6.3错误2 (13)6.4错误3 (13)7.收获及体会: (15)参考文献: (15)1.前言1.1课题内容及要求题目39:算术表达式的求解问题描述:给定一个算术表达式,通过程序求出最后的结果。

基本要求:从键盘输入要求解的算术表达式;采用栈结构进行算术表达式的求解过程;能够判断算术表达式正确与否;对于错误表达式给出提示;对于正确的表达式给出最后的结果;1.2选题目的及意义⑴进一步熟悉和使用栈的基本操作,如栈的初始化,进栈,出栈的特性。

⑵学习在实际生活中使用栈来解决问题。

2.系统分析2.1问题描述要正确计算表达式的值,必须要正确的解释表达式。

首先解释算术表达式的运算规则,分为以下三点:⑴先乘除后加减;⑵从左往右进行计算;⑶有括号的,先算括号内的;2.2运算符的优先级分析:任何一个表达式都是由运算符,操作数和界限符组成的。

这里把运算符,界限符统称为算符。

设两个操作符分别为op1和op2。

为实现运算符的优先法则,优先关系会出现三种情况,op1的优先级高于op2的优先级,op1的优先级等于op2的优先级,op1的优先级小于op2的优先级。

2.3错误提示分析:对于输入错误的,比如出现了表达式以外的非法字符,没有按照正确格式进行输入。

系统会给出提示。

数据结构课程设计-表达式求值【完整版】

数据结构课程设计-表达式求值【完整版】

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、算法:建立两个不同类型得空栈,先把一个‘#’压入运算符栈。

数据结构课程设计_带括号的算术表达式求值

数据结构课程设计_带括号的算术表达式求值

素元层顶最的中栈回返 // ;)(daeHteG
XX
作操栈空清 // ;)(y tpmEekaM
计设程课析分法算与构结据数)++C( :称名程课
。出输的等果结行进数函 tuptuo 用 )4( 。算运的同不行进符作操
的数先优的同不。级先优定确�型类符作操断判则�符作操为取读果如 )3(
atad 进并数作操读 �)kcabtup.nic(流入输回返符字将则 �数作操为取读果如 )2(
;pmt eteled
;daeh=pm t* >melE<edoNkcatS
)LLUN=!daeh(elihw
{
)(ytpm EekaM di ov
XX
{
计设程课析分法算与构结据数)++C( :称名程课
;hc rahc
流入输空清 //)(maertsraelc di ov
{
;1- nruter
}
}
。境环发开的谐
统系作操 swodniW 于基个一是且而�器译编++C 个一是仅不 0.6++C lausiV
�中际实以所。0.4TN swodniW 和 PX swodniW,0002 swodniW 于用适只�性限局 的大很的用应的它但�)0.7++C lausiV(TEN.++C lausiV 了出推司公软微然虽
>melE ssalc< etalpmet
kcatS ssalc
;ldne<<e<<" : si mele"<<tuoc//
} {
;}
)l(knil,)e(mele:)LLUN=l* >melE<edoNkcatS ,0=e melE( edoNkcatS

数据结构课程设计之算术表达式求值

数据结构课程设计之算术表达式求值

1【实验题目及要求】[问题描述]一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。

假设操作数是正实数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,如:#(7+15)*(23-28/4)#。

引入表达式起始、结束符是为了方便。

编程利用“算符优先法”求算术表达式的值。

[基本要求](1)从键盘或文件读入一个合法的算术表达式,输出正确的结果。

(2)显示输入序列和栈的变化过程。

(3)考虑算法的健壮性,当表达式错误时,要给出错误原因的提示。

(4) 实现非整数的处理(可选功能)。

2【源代码(C语言)】#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAXSIZE 20#define OK 1#define ERROR 0#define OVERLOW 0#define YES 1#define NO 0typedefstruct{char * base;char * top;int stacksize; //最大存储量}OPTR; //字符存储栈typedefstruct{float *base;float *top;int stacksize; //最大存储量}OPND; //数值存储栈int InitOptrStack(OPTR *); //字符栈初始化函数int OptrPush(OPTR *, char); //进字符栈操作int OptrPop(OPTR*, char *); //出字符栈操作int OptrEmpty(OPTR ); //判断字符栈是否为空char GetOptrTop(OPTR); //返回字符栈顶元素int InitOpndStack(OPND *); //数值栈初始化函数int OpndPush(OPND *, float); //进数值栈操作int OpndPop(OPND*, float*); //出数值栈操作int OpndEmpty(OPND ); //判断数值栈是否为空int JudgeChar(char); //判断是否为字符float GetFloat(char *); //接收一个数字char Precede(char, char); //判断优先级操作float Caculate(float,float,char);//计算数值{char ch, noMean, ci;float num, number1, number2;OPTR optr;OPND opnd;//system("color 30");InitOptrStack(&optr);InitOpndStack(&opnd);while(1){printf(" 请输入表达式以“#”开始,以“#”结束\n ");do{ch = getchar();}while(ch !='#'); //忽略前面非‘#’字符OptrPush(&optr, ch);ch = getchar();while(ch != '#' || GetOptrTop(optr) != '#'){if(!JudgeChar(ch)){ //如果输入的是数字num = GetFloat( &ch );OpndPush(&opnd, num);else{ //输入的是字符switch(Precede(GetOptrTop(optr),ch)){case'<':OptrPush(&optr,ch); //栈顶优先级低ch = getchar();break;case'=':OptrPop(&optr,&noMean); //左右括号,把左括号出栈ch = getchar ();break;case'>': //栈顶优先级高if(OpndPop(&opnd, &number2) && OpndPop(&opnd,&number1)){OptrPop(&optr, &ci);num = Caculate(number1, number2, ci ); //出栈计算OpndPush(&opnd, num);}else{printf(" 输入过多运算符!\n");system ("PAUSE");exit(0);}break;}//witch}//else}if(opnd.top -opnd.base >= 2){printf(" 俩个括号之间缺少运算符!\n ");system ("PAUSE");exit( 0 );}OpndPop(&opnd,&num); //直接把OPND的栈元素赋值给numprintf(" 运算结果为%.3f\n", num);}system ("PAUSE");}int InitOptrStack(OPTR * OP){OP->base = (char*)malloc((MAXSIZE+1)*sizeof(char));OP->top = OP->base;OP->stacksize = MAXSIZE;return OK;}int OptrPush(OPTR *OP, char ch){*(OP->top) = ch;OP->top++;return OK;}int OptrPop(OPTR *OP, char *ch){if(OP->base == OP->top)return ERROR;else{OP->top--;*ch = *(OP->top);return OK;}}int OptrEmpty(OPTR OP){if(OP.top == OP.base )return YES;elsereturn NO;}char GetOptrTop(OPTR OP){return *(OP.top -1);}int InitOpndStack(OPND * OP){if(!(OP->base = (float*)malloc((MAXSIZE+1)*sizeof(float)))) exit(OVERLOW);OP->top = OP->base;OP->stacksize = MAXSIZE;return OK;}int OpndPush(OPND *OP, float number) {*(OP->top) = number;OP->top++;return OK;}int OpndPop(OPND *OP, float* number) {if(OP->top == OP->base)return ERROR;else{OP->top--;*number = *(OP->top);return OK;}}int OpndEmpty(OPND OP){if(OP.top == OP.base )return YES;elsereturn NO;}int JudgeChar(char ch){if(ch>='0'&&ch<= '9')return NO;elsereturn YES;}float GetFloat(char* ch){int i;float num = 0;for( i = 0; *ch>= '0'&& *ch<= '9'; i++){ num = num*10 + *ch - '0';*ch = getchar();}return num;}char Precede(char a, char b){char ch;switch(a){case'+':case'-': if(b == '*' || b == '/' || b == '(')ch = '<';elsech = '>';break;case'*':case'/': if( b == '(')ch = '<';elsech = '>';break;case'(': if(b == ')')ch = '=';elseif(b == '#'){printf(" 缺少反括号\n");system ("PAUSE");exit(0);}elsech = '<';break;case')': if(b == '('){printf(" 两个括号之间没有符号相连!\n");system("PAUSE");exit(0);}ch = '>';break;case'#': if(b == '#')ch = '=';elseif(b == ')'){printf(" 没有左括号!\n ");system("PAUSE");exit(0);}elsech = '<';break;default: printf(" 输入运算符超出范围! \n ");system ("PAUSE");exit(0);break;}return ch;}float Caculate(float number1, float number2, char ci){float num;switch( ci){case'+': num = number1 + number2; break;case'-': num = number1 - number2; break;case'*': num = number1 * number2; break;case'/': num = number1 / number2; break;}return num;}3【算法思想】根据栈的原理,建立数字栈OPND和运算符号栈OPTR,对读入的字符进行判断,存入不同的栈内,每次读入一个字符就把该字符和运算符栈顶的优先级进行比较,然后选择相应的操作,这是这个程序的核心代码,如下:switch(Precede(GetOptrTop(optr),ch)){case '<':OptrPush(&optr,ch); //栈顶优先级低ch = getchar();break;case '=':OptrPop(&optr,&noMean); //左右括号,把左括号出栈ch = getchar ();break;case '>': //栈顶优先级高if(OpndPop(&opnd, &number2) && OpndPop(&opnd, &number1)){OptrPop(&optr, &ci);num = Caculate(number1, number2, ci ); //出栈计算OpndPush(&opnd, num);}else{printf(" 输入过多运算符!\n");system ("PAUSE");exit(0);}break;}//witch4【实现效果】完全可以实现题目的要求,除了下图的错误提示,本程序还可以提示的错误有:输入过多运算符,缺少反括号,两个括号之间缺少运算符相连,缺少左括号,输入的运算符超出范围等提示。

数据结构课程设计报告-中缀算术表达式求值

数据结构课程设计报告-中缀算术表达式求值

课程设计报告课程名称数据结构课题名称中缀算术表达式求值专业通信工程班级通信0902学号姓名指导教师2011 年07 月01 日湖南工程学院课程设计任务书课程名称数据结构课题中缀算术表达式求值专业班级通信工程0902学生姓名学号指导老师审批任务书下达日期2011 年06 月27日任务完成日期2011 年07 月01日设计要求:1. 课程设计报告规范(1)需求分析a.程序的功能。

b.输入输出的要求。

(2)概要设计a.程序由哪些模块组成以及模块之间的层次结构、各模块的调用关系;每个模块的功能。

b.课题涉及的数据结构和数据库结构;即要存储什么数据,这些数据是什么样的结构,它们之间有什么关系等。

(3)详细设计a.采用C语言定义相关的数据类型。

b.写出各模块的类C码算法。

c.画出各函数的调用关系图、主要函数的流程图。

(4)调试分析以及设计体会a.测试数据:准备典型的测试数据和测试方案,包括正确的输入及输出结果和含有错误的输入及输出结果。

b.程序调试中遇到的问题以及解决问题的方法。

c.课程设计过程经验教训、心得体会。

(5)使用说明用户使用手册:说明如何使用你编写的程序,详细列出每一步的操作步骤。

(6)书写格式a.设计报告要求用A4纸打印成册:b.一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。

(7)附录源程序清单(带注释)2. 考核方式指导老师负责验收程序的运行结果,并结合学生的工作态度、实际动手能力、创新精神和设计报告等进行综合考评,并按优秀、良好、中等、及格和不及格五个等级给出每位同学的课程设计成绩。

具体考核标准包含以下几个部分:(1)平时出勤(占10%)(2)系统需求分析、功能设计、数据结构设计及程序总体结构合理与否(占10%)(3)程序能否完整、准确地运行,个人能否独立、熟练地调试程序(占40%)(4)设计报告(占30%)注意:不得抄袭他人的报告(或给他人抄袭),一旦发现,成绩为零分。

数据结构课程设计带括号的算术表达式求值

数据结构课程设计带括号的算术表达式求值

、实验的目的和要求1.采用算符优先数算法, 能正确求值表达式;2.熟练掌握栈的应用;3•熟练掌握计算机系统的基本操作方法,了解如何编辑、编译、链接和运行一个C++程序; 4.上机调试程序,掌握查错、排错使程序能正确运行。

三、实验的环境:指硬件和软件环境1.硬件环境: Intel 奔腾双核T2390 双核处理器(1.86GHz 主频/1MB 二级缓存/533MHz 前端总线), RAM:2G .2.软件环境: 操作系统:windows vista编译软件:Microsoft Viual C++6.03.软件环境介绍:Visual C++是一个功能强大的可视化软件开发工具。

自1993年Microsoft公司推出Visual C++1.0后,随着其新版本的不断问世,Visual C++已成为专业程序员进行软件开发的首选工具。

虽然微软公司推出了Visual C++.NET(Visual C++7.0) ,但它的应用的很大的局限性,只适用于Windows 2000,Windows XP 和Windows NT4.0。

所以实际中,更多的是以Visual C++6.0 为平台。

Visual C++6.0不仅是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境( integrated development environment,IDE )。

Visual C++6.0 由许多组件组成,包括编辑器、调试器以及程序向导AppWizard 、类向导Class Wizard 等开发工具。

这些组件通过一个名为Developer Studio 的组件集成为和谐的开发环境。

四、算法描述:1.头文件:Stack.hCalculator.hMethod:Stack method:Push(); // 进栈操作Pop(); // 出栈操作GetHead(); // 返回栈中的最顶层元素MakeEmpty(); // 清空栈操作Calculator method:Calculator();// 计算主体celarstream(); // 清空输入流Prior();// 返回运算符的优先级done(); // 做一次二元运算output(); // 打印结果并输出EnEmpty(); // 调用MakeEmpty(), 并清空栈2.cpp 文件Calculator.cppMethod:int main(); // 主程序3.程序流程图优先级比较算法Data 算法存放操作字符 存放数据调用 Calculator 。

《数据结构》课程设计_排序算法比较以及算术表达式求值

《数据结构》课程设计_排序算法比较以及算术表达式求值

XXXXX大学《数据结构》课程设计报告排序算法比较算术表达式求值班级:学号:姓名:指导老师:目录一课程设计1——排序算法比较一、需求分析二、程序的主要功能三、程序运行平台四、数据结构五、算法及时间复杂度六、测试用例七、程序源代码二课程设计2——算术表达式求值一、需求分析二、程序的主要功能三、程序运行平台四、数据结构五、算法及时间复杂度六、测试用例七、程序源代码三感想体会与总结排序算法比较一、需求分析利用随机函数产生N个随机整数(N = 500,1000,1500,2000,2500,…,30000),利用直接插入排序、折半插入排序,起泡排序、快速排序、选择排序、堆排序,基数排序七种排序方法(可添加其它排序方法)进行排序(结果为由小到大的顺序),并统计每一种排序所耗费的时间(统计为图表坐标形式)。

二、程序的主要功能1.用户输入任意个数,产生相应的随机数2.用户可以自己选择排序方式(直接插入排序、折半插入排序、起泡排序、快速排序、选择排序、堆排序、基数排序)的一种3.程序给出原始数据、排序后从小到大的数据,并给出排序所用的时间。

三、程序运行平台Visual C++ 6.0版本四、数据结构本程序的数据结构为线形表,线性顺序表、线性链表。

1、结构体:typedef struct{int *r; //r指向线形表的第一个结点。

r[0]闲置,不同的算法有不同的用处,如用作哨兵等。

int length; //顺序表的总长度}Sqlist;2、空线性表Status InitSqlist(Sqlist &L){L.r=(int *)malloc(MAXSIZE*sizeof(int)); //分配存储空间if(!L.r){printf("存储分配失败!");exit(0);} //存储分配失败L.length=0;//初始长度为0return OK;}五、算法及时间复杂度(一)各个排序是算法思想:(1)直接插入排序:将一个记录插入到已排好的有序表中,从而得到一个新的,记录数增加1的有序表。

数据结构——算术表达式求值算法

数据结构——算术表达式求值算法

沈阳航空航天大学课程设计报告课程设计名称:数据结构课程设计课程设计题目:算术表达式求值算法院(系):计算机学院专业:计算机科学与技术班级:学号:姓名:指导教师:丁国辉完成日期:2013年01月11日目录第1章概要设计 01.1题目的内容与要求 01。

2总体结构 0第2章详细设计 (2)2。

1栈的顺序存储模块 (2)2。

2进栈模块 (2)2。

3出栈模块 (3)2。

4运算模块 (3)2。

5判断优先级模块 (4)2.6处理表达式主体模块 (5)第3章调试分析 (7)第4章运行结果 (8)参考文献 (10)附录(程序清单) (11)第1章概要设计1。

1题目的内容与要求内容:设计程序,其能够求解任意给定算数表达式的值,算数表达式中的操作符来自于集合{+,-,*,\},表达式允许包括小括号“()”,表达式的输入以“#”作为结束标志。

要求:1)利用栈结构实现表达式求值算法,即在约定的条件下,正确输入表达式,经过程序的运行之后,给出表达式的值;2)系统利用C语言实现;3)独立完成系统的设计、编码和调试.1。

2总体结构本程序主要分为六个模块(主要算法模块图见图1.1):栈的顺序存储模块、进栈模块、出栈模块、运算模块、判断优先级模块、处理表达式主体模块.栈的顺序存储模块:分别建立两个栈,第一个用来存储运算符,第二个是用来存储数字。

进栈模块:运算符和数字分别存储在运算符栈和数字栈中,以便运算时的调用。

出栈模块:由于运算的需要,就必须把运算符和数字分别从运算符栈和数字栈中取出来。

运算模块:程序在遇到运算符的时候,根据此模块的要求进行运算。

判断优先级模块:找出栈顶算符和即将入栈算符的对应的下标,然后根据算符间的优先关系表判断出算符的优先关系。

处理表达式主体模块:结合运算模块和判断优先级模块,对表达式进行系统处理,求出算数表达式的值.图1。

1 主要算法模块图第2章详细设计在本次课程设计中,我们用到了栈这个重要的数据结构。

在实现程序的功能的时候,有很多重要的程序段是涉及栈方面的:有栈的结构建立,入栈,出栈.另外还有就是对表达式进行运算,判断运算符的优先级,对表达式的主体进行处理.重要的程序段如下。

数据结构——算术表达式求值算法

数据结构——算术表达式求值算法

沈阳航空航天大学课程设计报告课程设计名称:数据结构课程设计课程设计题目:算术表达式求值算法院(系):计算机学院专业:计算机科学与技术班级:学号:姓名:指导教师:***完成日期:2013年01月11日沈阳航空航天大学课程设计报告目录第1章概要设计 (1)1.1题目的内容与要求 (1)1.2总体结构 (1)第2章详细设计 (3)2.1栈的顺序存储模块 (3)2.2进栈模块 (3)2.3出栈模块 (4)2.4运算模块 (4)2.5判断优先级模块 (5)2.6处理表达式主体模块 (6)第3章调试分析 (8)第4章运行结果 (9)参考文献 (11)附录(程序清单) (12)第1章概要设计1.1题目的内容与要求内容:设计程序,其能够求解任意给定算数表达式的值,算数表达式中的操作符来自于集合{+,-,*,\},表达式允许包括小括号“()”,表达式的输入以“#”作为结束标志。

要求:1)利用栈结构实现表达式求值算法,即在约定的条件下,正确输入表达式,经过程序的运行之后,给出表达式的值;2)系统利用C语言实现;3)独立完成系统的设计、编码和调试。

1.2总体结构本程序主要分为六个模块(主要算法模块图见图1.1):栈的顺序存储模块、进栈模块、出栈模块、运算模块、判断优先级模块、处理表达式主体模块。

栈的顺序存储模块:分别建立两个栈,第一个用来存储运算符,第二个是用来存储数字。

进栈模块:运算符和数字分别存储在运算符栈和数字栈中,以便运算时的调用。

出栈模块:由于运算的需要,就必须把运算符和数字分别从运算符栈和数字栈中取出来。

运算模块:程序在遇到运算符的时候,根据此模块的要求进行运算。

判断优先级模块:找出栈顶算符和即将入栈算符的对应的下标,然后根据算符间的优先关系表判断出算符的优先关系。

处理表达式主体模块:结合运算模块和判断优先级模块,对表达式进行系统处理,求出算数表达式的值。

图1.1 主要算法模块图第2章详细设计在本次课程设计中,我们用到了栈这个重要的数据结构。

数据结构课程设计算术表达式求值

数据结构课程设计算术表达式求值

计算机科学系《数据结构课程设计》报告课题名称:算术表达式求值目录1.问题描述-----------------------------------------------------------32.基本要求-----------------------------------------------------------33.工具/准备工作----------------------------------------------------34.分析与实现--------------------------------------------------------45. 课程设计体会与感悟------------------------------------------161.问题描述从键盘上输入中缀算术表达式,包括括号,计算出表达式的值。

2.基本要求(1)程序能对所输入的表达式做简单的判断,如表达式有错,能给适当提示。

(2)能处理单目运算符:+,-。

3.工具/准备工作在开始项目之前,应回顾复习相关内容。

需要一台计算机装有visual C++。

4.分析与实现对于中缀表达式,一般运算规则如下:(1)先乘方,再乘除,最后加减;(2)同级运算从左算到右;(3)先括号内再括号外;(4)用到的头文件”utility.h”,”lk_stack.h”,”node.h”,”calculator.h”.根据实践经验,可以对运算符设置统一的优先级,从而方便比较。

表中给出了包括加、上面讨论的的+、—为双目运算符,如为单目运算符,编程实现时,可在前面加上0而转化为双目运算符。

如在+、—的前一个字符(如当前字符不是运算符时,规定用0表示)为‘=’或‘(’,则为单目运算符。

具体实现算法时,可设置两个工作栈,一个为操作栈,一个为操作符栈optr,另外一个为操作数栈opnd,算法基本思路如下:(1)将optr栈和opnd栈清空,在optr栈中加入一个‘=‘。

《数据结构 课程设计》表达式求值 实验报告

《数据结构 课程设计》表达式求值 实验报告

实验课程名称专业班级学生姓名学号指导教师20 至 20 学年第学期第至周算术表达式求值演示一、概述数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。

同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

在这次的课程设计中我选择的题目是算术表达式求值演示。

表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。

设计一个程序,演示用算符优先法对算术表达式求值的过程。

深入了解栈和队列的特性,以便在解决实际问题中灵活运用它们,同时加深对这种结构的理解和认识。

二、系统分析1.以字符列的形式从终端输入语法正确的、不含变量的整数表达式。

利用已知的算符优先关系,实现对算术四则混合运算表达式的求值,并仿照教科书的例子在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。

2.一般来说,计算机解决一个具体问题时,需要经过几个步骤:首先要从具体问题抽象出一个适当的数学模型,然后设计一个解决此数学模型的算法,最后编出程序,进行测试,调试直至得到想要的答案。

对于算术表达式这个程序,主要利用栈,把运算的先后步骤进行分析并实现简单的运算!为实现算符优先算法,可以使用两个栈,一个用以寄存运算符,另一个用以寄存操作数和运算结果。

3.演示程序是以用户于计算机的对话方式执行,这需要一个模块来完成使用者与计算机语言的转化。

4.程序执行时的命令:本程序为了使用具体,采用菜单式的方式来完成程序的演示,几乎不用输入什么特殊的命令,只需按提示输入表达式即可。

(要注意输入时格式,否者可能会引起一些错误)5. 测试数据。

三、概要设计一个算术表达式中除了括号、界限符外,还包括运算数据和运算符。

由于运算符有优先级别之差,所以一个表达式的运算不可能总是从左至右的循序执行。

每次操作的数据或运算符都是最近输入的,这与栈的特性相吻合,故本课程设计借助栈来实现按运算符的优先级完成表达式的求值计算。

数据结构算术表达式求值实验报告

数据结构算术表达式求值实验报告

《数据结构》课程设计报告题目:____________算术表达式求值_________________目录1.前言 (2)2.概要设计 (2)2.1 数据结构设计 (2)2.2 算法设计 (2)2.3 ADT描述 (3)2.4 功能模块分析 (3)3.详细设计 (3)3.1 数据存储结构设计 (4)3.2主要算法流程图(或算法伪代码) (4)4.软件测试 (7)5.心得体会 (9)参考文献 (9)附录 (9)第 1 页数据结构课程设计1.前言在计算机中,算术表达式由常量、变量、运算符和括号组成。

由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。

因而在程序设计时,借助栈实现。

算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。

为简化,规定操作数只能为正整数,操作符为+、-*、/,用#表示结束。

算法输出:表达式运算结果。

算法要点:设置运算符栈和运算数栈辅助分析算符优先关系。

在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应运算。

2.概要设计2.1 数据结构设计任何一个表达式都是由操作符,运算符和界限符组成的。

我们分别用顺序栈来寄存表达式的操作数和运算符。

栈是限定于紧仅在表尾进行插入或删除操作的线性表。

顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置,base为栈底指针,在顺序栈中,它始终指向栈底,即top=base可作为栈空的标记,每当插入新的栈顶元素时,指针top增1,删除栈顶元素时,指针top减1。

2.2 算法设计为了实现算符优先算法。

可以使用两个工作栈。

一个称为OPTR,用以寄存运算符,另一个称做OPND,用以寄存操作数或运算结果。

1.首先置操作数栈为空栈,表达式起始符”#”为运算符栈的栈底元素;2.依次读入表达式,若是操作符即进OPND栈,若是运算符则和OPTR栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当前读入的字符均为”#”)。

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

表达式求值一目的利用《数据结构》课程的相关知识完成一个具有一定难度的综合设计题目,利用C/C++语言进行程序设计,并规地完成课程设计报告。

通过课程设计,巩固和加深对线性表、栈、队列、字符串、树、图、查找、排序等理论知识的理解;掌握现实复杂问题的分析建模和解决方法(包括问题描述、系统分析、设计建模、代码实现、结果分析等);提高利用计算机分析解决综合性实际问题的基本能力。

设计一个程序,演示以字符序列的形式输入不含变量的实数表达式求值的计算结果二需求分析设计一个程序,演示以字符序列的形式输入不含变量的实数表达式求值的计算结果。

对于这个程序我们从输入,输出,和功能三方面来分析。

1.程序输入:从键盘上输入表达式,一个算术表达式,由常量、运算符和括号组成(以字符串形式输入,不含变量)。

为了简化,操作数只能为浮点数,操作符为“ +”、“-”、“*”、“/”、“(”、“)”,用“#“表示结束。

2.程序输出:表达式运算结果,运算符栈、运算数栈、输入字符和主要操作变化过程,如运算符栈、运算数栈的出入记录,字符出入栈的过程,打印出完整的过程。

3.功能要求及说明:从键盘上输入表达式。

分析该表达式是否合法(包含分母不能为零的情况):(1)是数字,则判断该数字的合法性。

(2)是规定的运算符,则根据规则进行处理。

在处理过程中,将计算该表达式的值。

(3)若是其它字符,则返回错误信息。

若上述处理过程中没有发现错误,则认为该表达式合法,并打印处理结果。

三概要设计1.数据结构的选择:任何一个表达式都是由操作符,运算符和界限符组成的。

我们分别用顺序栈来寄存表达式的操作数和运算符。

栈是限定于紧仅在表尾进行插入或删除操作的线性表。

为了实现算符优先算法,可以使用两个工作栈。

一个称做SqStack1,用以寄存运算符;另一个称做SqStack2,用以寄存操作数或运算结果。

首先置操作数栈为空栈,表达式起始符“#”作为运算符栈的栈底元素,然后依次读入表达式的每个字符,若是操作数则进入SqStack2栈,若是运算符则和SqStack1栈的栈顶运算符比较优先权后做相应操作,直至整个表达式求值完毕。

两个栈: typedef struct //运算符栈{char *base;char *top;int stacksize;}SqStack1;typedef struct //运算数栈{float *base;float *top;int stacksize;}SqStack2;2.相关功能函数:void InitStack1(SqStack1 &S1);//声明运算符栈建立函数void InitStack2(SqStack2 &S2);//声明运算数栈建立函数主要的确定如何入栈的函数:void evaluate(SqStack1 &S1,SqStack2 &S2); void Push1(SqStack1 &S1,char e);//声明入栈函数void Push2(SqStack2 &S2,float e);//声明入栈函数char GetTop1(SqStack1 &S1);//声明取栈顶元素函数float GetTop2(SqStack2 &S2);//声明取栈顶元素函数char Pop1(SqStack1 &S1);//声明出栈函数float Pop2(SqStack2 &S2);//声明出栈函数char Compare(char m,char n);//声明比较函数通过这个函数我们来实现运算符运算的先后顺序判断运算符优先权,返回优先权高的算符间的优先关系如下:float Operate(float a,char rheta,float b);//声明运算函数为了使运算的过程更加直观的反应出来,我们再绘制一个表格,绘制表格的相关函数如下:void DispStack1(SqStack1 &S1);//从栈底到栈顶依次输出各元素void DispStack2(SqStack2 &S2);//从栈底到栈顶依次输出各元素3.函数模块之间的调用关系:主程序模块栈的建立及初始化模块判断输入是否结束模块判断字符类型模块输入结束输出结果运算数进栈模块运算符优先级比较模块运算符进栈模块运算符运算数出栈模块运算模块四详细设计首先本程序定义两个顺序栈:运算符栈(SqStack1)和运算数栈(SqStack2);typedef struct //运算符栈{char *base;char *top;int stacksize;}SqStack1;typedef struct //运算数栈{float *base;float *top;int stacksize;}SqStack2;然后是主要功能函数的详细设计:/*运算符栈函数*/void InitStack1(SqStack1 &S1)//构造一个空栈S1{S1.base=(char *)malloc(STACK_INIT_SIZE *sizeof(char));if(!S1.base)cout<<"存储分配失败!";//存储分配失败S1.top=S1.base;S1.stacksize=STACK_INIT_SIZE;}确定如何入栈的函数实现如下:void Push1(SqStack1 &S1,char e)//入栈{if(S1.top-S1.base>=S1.stacksize)//如果栈满,追加存储空间{S1.base=(char*)realloc(S1.base,(S1.stacksize+STACKINCREMENT)*sizeof(char));if(!S1.base) cout<<"存储分配失败!";else{S1.top=S1.base+S1.stacksize;S1.stacksize=S1.stacksize+STACKINCREMENT;}}*S1.top=e;S1.top=S1.top+1;//将元素压入栈中,指针上移}实现提取栈顶元素的函数实现:char GetTop1(SqStack1 &S1)//取栈顶元素{char e;if(S1.top==S1.base)cout<<"\n\t\t\t运算符栈已空!\n";else e=*(S1.top-1);return e;}以及设计的一个在结果显示过程的栈中清单打印函数void DispStack1(SqStack1 &S1)//从栈底到栈顶依次输出各元素{char e,*p;if(S1.top==S1.base)cout<<" ";else{p=S1.base;while(p<S1.top){e=*p;p++;cout<<e;}}}核心的算法确定如何入栈函数的实现如下void evaluate(SqStack1 &S1,SqStack2 &S2){char c;float t,e;int n=0,i=1,j=0,k=0,l=0;char ch[STACK_INIT_SIZE];int s=1;int flag=0,flag2=0;float p1,p2;char ch1;Push1(S1,'#');//将'#'入栈,作为低级运算符cout<<"●请输入不含变量的表达式(以#结束!):\n ";cin>>ch;c=ch[0];cout<<"\n●对表达式求值的操作过程如下:"<<"\n__________________________________________________________ ______________________\n"<<"步骤\t运算符栈S1\t运算数栈S2\t输入字符\t\t主要操作";while(c!='#'||GetTop1(S1)!='#'){cout<<"\n______________________________________________________ __________________________\n";cout<<i++<<"\t";DispStack1(S1);cout<<"\t\t";DispStack2(S2);cout<<"\t\t";if(flag==1){k--;flag=0;}if(flag2){k+=flag2;flag2=0;}for(l=0;l<k;l++)cout<<' ';for(j=k;ch[j]!='\0';j++)cout<<ch[j];if(ch[k]!='#'&&flag!=1) {k++;flag=0;}as:if(!(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')){//输入的字符如果不是运算符号,则继续输入直到输入的是运算符为止,将非运算符转换成浮点数if(!(c=='.')&&n>=0){e=float(c-48);n++;if(n==1)t=e;else if(n>1)t=t*10+e;c=ch[s++];}if(n==-1){e=float(c-48);t=t+e/10;c=ch[s++];}if(c=='.'){n=-1;c=ch[s++];}if((c>='0'&&c<='9')||c=='.'){flag2++;goto as;}if(c<'0'||c>'9'){Push2(S2,t);}cout<<"\t\tPush2(S2,"<<t<<")";}else//输入的是运算符{n=0;//非运算型数据计数器清零switch(Compare(GetTop1(S1),c))//比较运算符的优先级{case '<'://栈顶元素优先级低,则入栈且继续输入Push1(S1,c);cout<<"\t\tPush1(S1,"<<c<<")";c=ch[s++];break;case '='://栈顶元素优先级相等,脱括号并接收下一字符Pop1(S1);cout<<"\t\tPop1(S1)";c=ch[s++];break;case '>'://栈顶元素优先级高,则退栈并将运算结果入栈p1=Pop2(S2);p2=Pop2(S2);ch1=Pop1(S1);Push2(S2,Operate(p2,ch1,p1));cout<<"\t\tOperate("<<p2<<','<<ch1<<','<<p1<<')';flag=1;break;}}}cout<<"\n______________________________________________________ __________________________\n";cout<<i<<'\t'<<'#'<<"\t\t"<<GetTop2(S2)<<"\t\t";for(j=0;j<k;j++) cout<<' ';cout<<"#"<<"\t\t"<<"RETURN(GETTOP(S2))";cout<<"\n______________________________________________________ __________________________\n";if(S2.top-1==S2.base)//显示表达式最终结果cout<<"\n●表达式的结果为:"<<GetTop2(S2)<<endl;else cout<<"\n表达式出错!\n";}运算符的优先级比较函数实现如下char Compare(char m,char n)//运算符的优先级比较{if(n=='+'||n=='-')//输入符号为"+"、"-"{if(m=='('||m=='#')return '<';//栈顶元素为"("、"#",此时栈顶符号优先级低,返回"<"else return '>';//否则,栈顶符号优先级高,返回">"}else if(n=='*'||n=='/')//输入的符号为"*"、"/"{if(m==')'||m=='*'||m=='/')return '>';//栈顶元素为")"、"*"、"/",此时栈顶符号优先级高,返回">"else return '<';//否则,栈顶符号优先级低,返回"<"}else if(n=='(')return'<';//输入的符号为"(",则直接返回"<"else if(n==')')//输入的符号为")"{if(m=='(')return'=';//栈顶元素为"(",此时优先级同,返回"="else return '>';//否则,栈顶符号优先级高,返回">"}else //输入符号为其他{if(m=='#')return'=';//栈顶元素为"#",此时优先级同,返回"="else return '>';//否则,栈顶符号优先级高,返回">"}}以及最后的计算函数float Operate(float a,char theta,float b)//运算函数{float tmp=0;if (theta=='+')tmp=a+b;//从运算符栈取出的符号为"+",则运算数栈的两元素相加,并返回else if(theta=='-')tmp=a-b;//从运算符栈取出的符号为"-",则运算数栈的两元素相减,并返回else if(theta=='*')tmp=a*b;//从运算符栈取出的符号为"*",则运算数栈的两元素相乘,并返回else if(theta=='/') //从运算符栈取出的符号为"/",则运算数栈的两元素相除,并返回{if(b==0) cout<<"\n表达式出错!除数不能为0!\n";else tmp=a/b;}return tmp;}五调试分析1.结构分析:栈中的数据节点是通过数组来存储的。

相关文档
最新文档