首页 > 代码库 > 九度OJ-题目1019:简单计算器
九度OJ-题目1019:简单计算器
- 题目描述:
- 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
- 输入:
- 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
- 输出:
- 对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
- 样例输入:
1 + 2 4 + 2 * 5 - 7 / 11 0
- 样例输出:
3.00 13.36
分析:
题目难度:中等
解决方案:符号栈
难点:符号级别
c++代码如下:
#include <iostream> #include <stdio.h> #include <stack> #include <string.h> using namespace std; #define MAX_LEN 501 stack<double> num_stack; stack<char> sign_stack; char cs[MAX_LEN] ; int num_arr[MAX_LEN]; int n; int sign_arr[MAX_LEN]; int m; //判断符号 int isOp(char c){ return c=='+'||c=='-'||c=='*'||c=='/'; } //比较符号级别 int cmp(char o1,char o2){ if((o1=='/'||o1=='*')&&(o2=='+'||o2=='-'))return 1; return -1 ; } //单步运算 double op(char o,double a,double b){ double res = 0.0; if(o=='+')res = a+b; else if(o=='-')res = a - b; else if(o=='*')res = a * b; else res = a/b; return res ; } //主要函数计算表达式的结果 double getRes(){ int i=n-1,j=m-1; char t1,t2; double a,b,res ; num_stack.push(num_arr[i--]); sign_stack.push(sign_arr[j--]); while(!sign_stack.empty()){ if(i==-1&&j==-1){ t1 = sign_stack.top(); sign_stack.pop(); a = num_stack.top();num_stack.pop(); b = num_stack.top();num_stack.pop(); res = op(t1,a,b); num_stack.push(res); } if(i>=0){ num_stack.push(num_arr[i--]); } if(j>=0){ //关键!!! while(sign_stack.size()>0){ t1 = sign_stack.top(); t2 = sign_arr[j]; if(cmp(t1,t2)>0){ sign_stack.pop(); a =num_stack.top();num_stack.pop(); b =num_stack.top();num_stack.pop(); res = op(t1,a,b); num_stack.push(res); }else break; } sign_stack.push(sign_arr[j--]); } } res = num_stack.top() ;num_stack.pop(); return res ; } //表达式转化为两个数组 void cs2arr(){ int len = strlen(cs); int i ; int t = 0 ; n=0; m=0; for(i=0;1;i++){ if(isOp(cs[i])||cs[i]=='\0'){ if(isOp(cs[i]))sign_arr[m++] = cs[i]; num_arr[n++] = t; if(cs[i]=='\0')break; t = 0 ; } else if(cs[i]==' ')continue ; else { t*=10; t+=cs[i]-'0'; } } } int main() { while(1){ gets(cs); if(strcmp(cs,"0")==0)break; cs2arr(); printf("%.2lf\n",getRes()); } return 0; }
九度OJ-题目1019:简单计算器
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。