表达式求值
来源:互联网 发布:js混淆代码后解除混淆 编辑:程序博客网 时间:2024/05/12 02:31
表达式求值
时间限制:3000 ms | 内存限制:65535 KB
难度:4
- 描述
- ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。
比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)- 输入
- 第一行输入一个整数n,共有n组测试数据(n<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0 - 输出
- 每组都输出该组运算式的运算结果,输出结果保留两位小数。
- 样例输入
21.000+2/4=((1+2)*5+1)/4=
- 样例输出
1.504.00
模拟栈:
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<iostream>using namespace std;int we(char a){ switch(a) { case '-' : case '+' : return 1; break; case '/' : case '*' : return 2; break; case '(' : return 0; break; default : return -1; }}int main(){ int i,j,k,n,t,top,p; scanf("%d",&n); while(n--) { int f=0,k=0; char s[15]; char s2[1000+10],s1[1000+10]; double s4[10010]; memset(s4,0,sizeof(s4)); scanf("%s",s1); t=strlen(s1); int top=0; int p=0; for(i=0; i<t; i++) {// if(s1[i]=='=')// bre //printf("!!!%d\n",i); if((s1[i]>='0'&&s1[i]<='9')||s1[i]=='.') { s[k++]=s1[i]; f=1; continue; } if(f) { s[k]='\0'; //printf("^^^%.2lf\n",atof(s)); s4[p++]=atof(s); //printf("%.2lf %.2lf\n",s4[0],s4[1]); k=0; f=0; // printf("***%d\n",p); } if(s1[i]=='(') { s2[++top]=s1[i]; } if(s1[i]==')') { while(s2[top]!='(') { double we; double ni,ha; p=p-1; ni=s4[p]; ha=s4[--p]; if(s2[top]=='+') { we=ni+ha; s4[p++]=we; } if(s2[top]=='-') { we=ha-ni; s4[p++]=we; } if(s2[top]=='*') { we=ha*ni; s4[p++]=we; } if(s2[top]=='/') { we=ha/ni; s4[p++]=we; } --top; } --top; } if(s1[i]=='/'||s1[i]=='*'||s1[i]=='-'||s1[i]=='+') { while(we(s1[i])<=we(s2[top])) { double we; double ni,ha; p=p-1; ni=s4[p]; ha=s4[--p]; if(s2[top]=='+') { we=ni+ha; s4[p++]=we; } if(s2[top]=='-') { we=ha-ni; s4[p++]=we; } if(s2[top]=='*') { we=ha*ni; s4[p++]=we; } if(s2[top]=='/') { we=ha/ni; s4[p++]=we; } --top; } s2[++top]=s1[i]; } if(s1[i]=='=') break; } //printf("%c\n",s2[top]); //printf("$%.2lf %.2lf\n",s4[0],s4[1]); while(top>=1) { double we; double ni,ha; p=p-1; ni=s4[p]; ha=s4[--p]; if(s2[top]=='+') { we=ni+ha; s4[p++]=we; } if(s2[top]=='-') { we=ha-ni; s4[p++]=we; } if(s2[top]=='*') { we=ha*ni; s4[p++]=we; } if(s2[top]=='/') { we=ha/ni; s4[p++]=we; } --top; if(s2[1]=='(') break; }printf("%.2lf\n",s4[p-1]); } return 0;}
0 0
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 【Test 2016-10-1】模拟+差分序列+spfa最短路+贪心
- Volley(二) 源码分析
- Eclipse使用技巧总结
- 如何将library项目打包成jar文件
- 修改历史指令条数
- 表达式求值
- c语言 -- 指针和结构体
- Android wear编程与开发(二)
- 最长回文子串
- 手机功能测试点
- Http2.0核心优势
- pyspider爬虫框架源码分析
- 程序员面试指南之设计一个有GetMin功能的栈
- leetCode_Split Array Largest Sum