【C语言】简易科学计算器源代码(链栈的应用)(原创).doc_第1页
【C语言】简易科学计算器源代码(链栈的应用)(原创).doc_第2页
【C语言】简易科学计算器源代码(链栈的应用)(原创).doc_第3页
【C语言】简易科学计算器源代码(链栈的应用)(原创).doc_第4页
【C语言】简易科学计算器源代码(链栈的应用)(原创).doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

用到的是算符优先法的思想,现摘自严蔚敏的数据结构(C语言版)的3.2.5章来详细说明算符优先法的思想:(摘抄结束)我给出的计算器功能有:支持欧拉数e,支持圆周率pi,支持运算符=,-,*,/,求幂符号,阶乘!,正弦sin,余弦cos,正切tan,以10为底的对数函数lg,以欧拉数为底的对数函数ln,优先级表为:(!表示不合法)#include #include #include #include #include /引用请注明出处:/liangxiaowen1989/blog/item/af972310f7119670ca80c413.html#define MAX_TOKEN_LEN 100 /标记最大长度#define EXPR_INCREMENT 20/表达式长度的增量typedef struct double opnd; /操作数char optr11; /运算符int flag; /若为1,则为单目运算符,2则是双目运算符 SElemType; /栈元素类型typedef struct SNode /栈SElemType date;struct SNode * next; SNode, *Stack;struct /用来存储一个操作数或运算符char strMAX_TOKEN_LEN;int type; /类型,若为0,则为操作数,若为1则为运算符 token;struct /expression,用来存储表达式char *str;int cur; /标记读取expr的当前位置expr;Stack OPND, OPTR; /操作数栈operand,运算符栈operatorint expr_size; /表达式长度void InitStack(Stack *S) /初始化栈*S = (Stack)malloc(sizeof(SNode);if(!(*S) printf(动态申请内存失败!n);exit(0); /if(*S)-next = NULL; /InitStackvoid DestroyStack(Stack *S) /销毁栈SNode *p;while(p = *S) *S = p-next;free(p); /while /DestroyStackvoid Push(Stack S, SElemType e) /入栈SNode *p;p = (SNode *)malloc(sizeof(SNode);if(! p) printf(动态申请内存失败!n); exit(0); /ifstrcpy(p-date.optr,e.optr);p-date.opnd = e.opnd;p-date.flag = e.flag;p-next = S-next;S-next = p; /Pushvoid Pop(Stack S,SElemType *e) /出栈SNode *p;p = S-next;if(! p) printf(栈为空,不能出栈!n);exit(0); /ifS-next = p-next;strcpy(e-optr,p-date.optr);e-opnd = p-date.opnd;e-flag = p-date.flag;free(p); /Popvoid get_expr() /获取expr字符串char *p;int size;expr.cur = 0;expr_size = 100;expr.str = (char*)malloc(expr_size * sizeof(char);if(! expr.str) printf(内存分配失败!n);exit(0); /ifsize = 0;p = expr.str;while(*p = getchar() != n) if(*p != ) if(*p = A) & (*p = 0) & (ch = a) & (*p = a) & (expr.strexpr.cur+1 optr;str2 = optr2-optr;if(!strcmp(str1,ln) | !strcmp(str1,lg) | !strcmp(str1,sin) | !strcmp(str1,cos) | !strcmp(str1,tan) optr1-flag = 1; /这些均为单目运算符return (!strcmp(str2,() | !strcmp(str2,) | !strcmp(str2,!) ? ; /ifif(!strcmp(str1,!) optr1-flag = 1;return ; /ifoptr1-flag = 2;switch(str10) case +: case -: return (!strcmp(str2,+) |!strcmp(str2,-) | !strcmp(str2,) | !strcmp(str2,#) ? : : ;case (: return !strcmp(str2,) ? = : ;case : return (!strcmp(str2,() | !strcmp(str2,!) | !strcmp(str2,) ? ;case #: return !strcmp(str2,#) ? = : ; /switch /Precedelong factorial(long n) /阶乘return (n next-date.optr,#) if(token.type) /说明token存储的是运算符strcpy(optr.optr,token.str);switch(Precede(&(OPTR-next-date),&optr) case : /退栈并将运算结果入栈Pop(OPTR,&optr);Pop(OPND,&opnd2);if(optr.flag = 2) /是双目运算符才需另一个操作符Pop(OPND,&opnd1); /ifPush(OPND,Operate(opnd1,optr,opnd2); /switch /ifelse /说明token存储的是操作数opnd1.opnd = atof(token.str);Push(OPND,opnd1);/atof将token.str转换为双精度数gettoken(); /获取下一个标记 /else /whileprintf(%.16gnn,OPND-next-date.opnd);free(expr.str);DestroyStack(&OPTR);DestroyStack(&OPND); /whilefree(expr.str);return 0; /main/实例测试:23.243*(5 - (2-13/.23)/(2-9.235)-(4-20) / 2)-32*(3+2.23/ (2*3)/标准答案为:-2380.7610725282693238114006817341/实例测试2: 23.243*(5-(2!-13/0.23)/(2!-9.235)-(4!-20)!/2!)-32*(3!+2.23/(2*3)!)/答案: -

温馨提示

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

最新文档

评论

0/150

提交评论