数据结构算术表达式求值_第1页
数据结构算术表达式求值_第2页
数据结构算术表达式求值_第3页
数据结构算术表达式求值_第4页
数据结构算术表达式求值_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、word二 课程设计2算术表达式求值1、 需求分析2、 程序的主要功能3、 程序运行平台4、 数据结构5、 算法及时间复杂度6、 测试用例7、 程序源代码三 感想体会与总结算术表达式求值一、需求分析一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#,如:#7+15*23-28/4#。引入表达式起始、结束符是为了方便。编程利用“算符优先法求算术表达式的值。二、程序的主要功能1 从键盘读入一个合法的算术表达式,输出正确的结果。2 显示输入序列和栈的变

2、化过程。三、程序运行平台Visual C+ 版本四、数据结构本程序的数据结构为栈。1运算符栈局部:struct SqStack /定义栈 char *base; /栈底指针 char *top; /栈顶指针 int stacksize; /栈的长度;int InitStack (SqStack &s) /建立一个空栈S if (! = (char *)malloc(50 * sizeof(char) exit(0); =; =50; return OK; char GetTop(SqStack s,char &e) /运算符取栈顶元素 if = /栈为空的时候返回ERROR p

3、rintf("运算符栈为空!n"); return ERROR; else e=*; /栈不为空的时候用e做返回值,返回S的栈顶元素,并返回OK return OK; int Push(SqStack &s,char e) /运算符入栈 if >= printf("运算符栈满!n"); =(char*)realloc ,+5)*sizeof(char) ); /栈满的时候,追加5个存储空间 if(! exit (OVERFLOW); =+; +=5;*+=e; /把e入栈return OK; int Pop(SqStack &s,c

4、har &e) /运算符出栈if = /栈为空栈的时候,返回ERROR printf("运算符栈为空!n"); return ERROR; elsee=*; /栈不为空的时候用e做返回值,删除S的栈顶元素,并返回OKreturn OK; int StackTraverse(SqStack &s) /运算符栈的遍历 char *t;t= ;if = printf("运算符栈为空!n"); /栈为空栈的时候返回ERROR return ERROR;while(t!= printf(" %c",*t); /栈不为空的时候依次

5、取出栈内元素 t+; return ERROR;(2) 数字栈局部: struct SqStackn /定义数栈 int *base; /栈底指针 int *top; /栈顶指针 int stacksize; /栈的长度;int InitStackn (SqStackn &s) /建立一个空栈S =(int*)malloc(50*sizeof(int); if(!exit(OVERFLOW); /存储分配失败 =; =50; return OK; int GetTopn(SqStackn s,int &e) /数栈取栈顶元素 if = printf("运算数栈为空!n

6、"); /栈为空的时候返回ERROR return ERROR; else e=*; /栈不为空的时候,用e作返回值,返回S的栈顶元素,并返回OK return OK; int Pushn(SqStackn &s,int e) /数栈入栈 if >=printf("运算数栈满!n"); /栈满的时候,追加5个存储空间 =(int*)realloc ,+5)*sizeof(int) ); if(! exit (OVERFLOW); =+; /插入元素e为新的栈顶元素 +=5;*+=e; /栈顶指针变化return OK; int Popn(SqStac

7、kn &s,int &e) /数栈出栈if = printf(" 运算符栈为空!n"); /栈为空栈的视时候,返回ERROR return ERROR; elsee=*; /栈不空的时候,那么删除S的栈顶元素,用e返回其值,并返回OKreturn OK; int StackTraversen(SqStackn &s) /数栈遍历 int *t;t= ;if = printf(" 运算数栈为空!n"); /栈为空栈的时候返回ERROR return ERROR;while(t!= printf(" %d",*t)

8、; /栈不为空的时候依次输出 t+; return ERROR;五、算法及时间复杂度1、算法:建立两个不同类型的空栈,先把一个# 压入运算符栈。输入一个算术表达式的字符串以#结束,从第一个字符依次向后读,把读取的数字放入数字栈,运算符放入运算符栈。判断新读取的运算符和运算符栈顶得运算符号的优先级,以便确定是运算还是把运算符压入运算符栈。最后两个#遇到一起那么运算结束。数字栈顶的数字就是要求的结果。2、时间复杂度:O(n)数据压缩存储栈,其操作主要有:建立栈int Push(SeqStack *S, char x)入栈int Pop(SeqStack *S, char x)出栈。以上各操作运算的

9、平均时间复杂度为O(n),其主要时间是消耗在输入操作。6、 测试用例如下图。最终结果如下图:7、 源代码/*第七题 算术表达式求值问题描述一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#,如:#7+15*23-28/4#。引入表达式起始、结束符是为了方便。编程利用“算符优先法求算术表达式的值。根本要求1 从键盘读入一个合法的算术表达式,输出正确的结果。2 显示输入序列和栈的变化过程。*/#include <>#include <

10、;>#include <>#include <>#include <>#include <>#define OK 1#define ERROR 0#define STACK_INIT_SIZE 100 /#define STACKINCREMENT 10/=/ 以下定义两种栈,分别存放运算符和数字/=/*运算符栈局部*struct SqStack /定义栈 char *base; /栈底指针 char *top; /栈顶指针 int stacksize; /栈的长度;int InitStack (SqStack &s) /建立一个空

11、栈S if (! = (char *)malloc(50 * sizeof(char) exit(0); =; =50; return OK; char GetTop(SqStack s,char &e) /运算符取栈顶元素 if = /栈为空的时候返回ERROR printf("运算符栈为空!n"); return ERROR; else e=*; /栈不为空的时候用e做返回值,返回S的栈顶元素,并返回OK return OK; int Push(SqStack &s,char e) /运算符入栈 if >= printf("运算符栈满!n

12、"); =(char*)realloc ,+5)*sizeof(char) ); /栈满的时候,追加5个存储空间 if(! exit (OVERFLOW); =+; +=5;*+=e; /把e入栈return OK; int Pop(SqStack &s,char &e) /运算符出栈if = /栈为空栈的时候,返回ERROR printf("运算符栈为空!n"); return ERROR; elsee=*; /栈不为空的时候用e做返回值,删除S的栈顶元素,并返回OKreturn OK; int StackTraverse(SqStack &am

13、p;s) /运算符栈的遍历 char *t;t= ;if = printf("运算符栈为空!n"); /栈为空栈的时候返回ERROR return ERROR;while(t!= printf(" %c",*t); /栈不为空的时候依次取出栈内元素 t+; return ERROR;/*数字栈局部* struct SqStackn /定义数栈 int *base; /栈底指针 int *top; /栈顶指针 int stacksize; /栈的长度;int InitStackn (SqStackn &s) /建立一个空栈S =(int*)mall

14、oc(50*sizeof(int); if(!exit(OVERFLOW); /存储分配失败 =; =50; return OK; int GetTopn(SqStackn s,int &e) /数栈取栈顶元素 if = printf("运算数栈为空!n"); /栈为空的时候返回ERROR return ERROR; else e=*; /栈不为空的时候,用e作返回值,返回S的栈顶元素,并返回OK return OK; int Pushn(SqStackn &s,int e) /数栈入栈 if >=printf("运算数栈满!n")

15、; /栈满的时候,追加5个存储空间 =(int*)realloc ,+5)*sizeof(int) ); if(! exit (OVERFLOW); =+; /插入元素e为新的栈顶元素 +=5;*+=e; /栈顶指针变化return OK; int Popn(SqStackn &s,int &e) /数栈出栈if = printf(" 运算符栈为空!n"); /栈为空栈的视时候,返回ERROR return ERROR; elsee=*; /栈不空的时候,那么删除S的栈顶元素,用e返回其值,并返回OKreturn OK; int StackTraversen

16、(SqStackn &s) /数栈遍历 int *t;t= ;if = printf(" 运算数栈为空!n"); /栈为空栈的时候返回ERROR return ERROR;while(t!= printf(" %d",*t); /栈不为空的时候依次输出 t+; return ERROR;/=/ 以下定义函数/=int Isoperator(char ch) /判断是否为运算符,分别将运算符和数字进入不同的栈switch (ch)case '+':case '-':case '*':case '

17、;/':case '(':case ')':case '#':return 1;default:return 0;int Operate(int a, char op, int b) /运算操作int result;switch(op)case '+':result=a+b;break;case '-':result=a-b;break;case '*':result=a*b;break;case '/':result=a/b;break;return result;char

18、 Precede(char ch1, char ch2) /运算符优先级的比拟 char p; switch(ch1) case '+': case '-': if (ch2='+'|ch2='-'|ch2=')'|ch2='#') p = '>' /ch1运算符的优先级小于ch2运算符 else p = '<' break; case '*': case '/': if (ch2 = '(') p = &#

19、39;<' else p = '>' break; case '(': if (ch2 = ')')p = '=' else if (ch2 = '#') printf(" 表达式错误!运算符不匹配!n") ;exit(0); elsep = '<' break ; case ')': if (ch2 = '(') printf(" 表达式错误!运算符不匹配!n") ;exit(0); else p =

20、 '>' break ; case '#': if (ch2 = ')') printf(" 表达式错误!运算符不匹配!n") ; exit(0); else if (ch2 = '#')p = '=' elsep='<' break; return p; /=/ 以下是求值过程/=int EvaluateExpression() /参考书p53算法 int a, b, temp, answer; char ch,op,e; char *str; int j = 0;

21、 SqStackn OPND; /OPND为运算数字栈 SqStack OPTR; /OPTR为运算符栈 InitStack(OPTR); Push(OPTR,'#'); /,所以此栈底是'#',因为运算符栈以'#'作为结束标志 InitStackn(OPND); / printf("nn按任意键开始求解:nn"); / ch=getch(); printf("n请输入表达式并以'#'结束:n"); str =(char*)malloc(50*sizeof(char); gets(str);

22、 ch=strj; /ch是字符型的,而e是整型的整数 j+; GetTop(OPTR,e); /e为栈顶元素返回值 while (ch!='#' | e!='#') if (!Isoperator(ch) /遇到数字,转换成十进制并计算 temp=ch-'0' /将字符转换为十进制数 ch=strj; j+; while(!Isoperator(ch) temp=temp*10 + ch-'0' /将逐个读入运算数的各位转化为十进制数 ch=strj; j+; Pushn(OPND,temp); else if (Isopera

23、tor(ch) /判断是否是运算符,不是运算符那么进栈 switch (Precede(e,ch) case '<' : Push(OPTR,ch); / 栈顶元素优先权低 ch = strj+;printf("nn 运算符栈为:n"); /输出栈,显示栈的变化StackTraverse(OPTR);printf("n 运算数栈为:n");StackTraversen(OPND);break; case '=' : Pop(OPTR,op); / 脱括号并接收下一字符 ch = strj+ ;printf("

24、;nn 运算符栈为:n");StackTraverse(OPTR);printf("n 数栈为:n");StackTraversen(OPND);break; case '>' : Pop(OPTR,op); /弹出最上面两个,并运算,把结果进栈 Popn(OPND,b);Popn(OPND,a);Pushn(OPND,Operate(a,op,b);printf("nn 运算符栈为:n");StackTraverse(OPTR);printf("n 数栈为:n");StackTraversen(OPN

25、D); else printf("您的输入有问题,请检查重新输入!"); exit(0); GetTop(OPTR,e); /取出运算符栈最上面元素是否是'#' /while GetTopn(OPND,answer); /已输出。数字栈最上面即是最终结果 return answer;/=/ 执行局部/=void ShowMenu()printf("nn");printf("n");printf(" n");printf(" 表达式求值系统 n");printf(" n");printf("n");void Quit();voi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论