题目1019:简单计算器
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:4431
解决:1653
-
题目描述:
-
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
-
输入:
-
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
-
输出:
-
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
-
样例输入:
-
1 + 2 4 + 2 * 5 - 7 / 11 0
-
样例输出:
-
3.00 13.36
-
来源:
- 2006年浙江大学计算机及软件工程研究生机试真题
-
- 分析:栈的应用,流程图如下,
-
- c++代码:
-
//1019简单计算器 //默认输入合法 包含数字 + - * / 空格 #include<stack> #include<string.h> #include<string> #include<stdio.h> #include<cmath> #include<iostream> using namespace std; #define ENDOFSTR '#' #define SP ' ' const int MAX = 210; const int mat[][5] = {//优先级矩阵,0为#;1为+;2为-;3为*;4为/;#优先级最小 //如1,2即符号栈顶为+ 当前符号位-, //mat[i][j]=1则代表i优先级高于j,0表示不高于 1,0,0,0,0, 1,0,0,0,0, 1,0,0,0,0, 1,1,1,0,0, 1,1,1,0,0, }; //操作符标号 int ch2pri(char x) { //#,+,-,*,/对应0.1.2.3.4 switch (x) { case '#': return 0;break; case '+': return 1;break; case '-': return 2;break; case '*': return 3;break; case '/': return 4;break; default:break; } } double cal(double x, char op, double y) { switch (op) { case '+': return x + y;break; case '-': return x - y;break; case '*': return x * y;break; case '/': return x / y;break; default:break; } } int main(void) { char str[MAX];//输入字符串 while(gets(str) && !(str[0]=='0' && str[1]==0)) { stack<char> opCh;//操作符栈 stack<double> opNum;//操作数栈 double ans = 0.0;//记录结果 int len = strlen(str);//字符串长度 str[len++] = SP;//添加默认结束符 ,加空格方便数字提取 str[len] = ENDOFSTR; str[len+1] = '\0'; int i; for(i=0; i<=len; ++i)//遍历字符串 { char ch = str[i];//当前字符 if(ch == SP) { continue; } if(ch>='0' && ch<='9')//为数字 { //获取到下一个空格的 int j = i; while(str[j] != SP) { j++; } //组成数字 int itemp = 0; int k,exp = j-i-1; for(k=i; k<j; k++) { itemp += (str[k]-'0')*pow(10,exp--); } //压入 opNum.push(itemp); //遍历游标更新 i = j; } else //为字符 { //栈顶是否存在 if(opCh.empty())//不存在加入到符号栈直接 { opCh.push(ch); } else//存在 { if(mat[ch2pri(ch)][ch2pri(opCh.top())] == 1)//当前操作符比栈顶操作符优先级高 opCh.push(ch); else { //取数 while(!opCh.empty() && mat[ch2pri(ch)][ch2pri(opCh.top())] == 0) { double pre, pro; pro = opNum.top(); opNum.pop(); pre = opNum.top(); opNum.pop(); //运算 double calnum = cal(pre,opCh.top(),pro); opNum.push(calnum); opCh.pop(); } opCh.push(ch); } } } if(!opCh.empty() && opCh.top()==ENDOFSTR && i==len)//完成全部计算 { ans = opNum.top();//结果 break; } } printf("%.2f\n",ans); } return 0; } /************************************************************** Problem: 1019 User: ranchothu Language: C++ Result: Accepted Time:0 ms Memory:1616 kb ****************************************************************/