题目描述
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
输出
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
样例输入
30 / 90 - 26 + 97 - 5 - 6 - 13 / 88 * 6 + 51 / 29 + 79 * 87 + 57 * 92
0
样例输出
12178.21
提示 [+]
*** 提示已隐藏,点击上方 [+] 可显示 ***
来源
【思路】:
/*********************************
* 日期:2013-3-15
* 作者:SJF0115
* 题号: 天勤OJ 题目1100: 简单计算器
* 来源:http://www.acmclub.com/problem.php?id=1100(http://acm.hdu.edu.cn/showproblem.php?pid=1237)
* 结果:AC
* 来源:2006年浙江大学计算机及软件工程研究生机试真题
* 总结:
**********************************/
#include<stdio.h>
#include<iostream>
#include<stack>
#include<string.h>
using namespace std;
//算符优先级
char Precede(char c1,char c2){
switch(c1){
case '+':
case '-':
if(c2 == '*' || c2 == '/'){
return '<';
}
else{
return '>';
}
break;
case '*':
case '/':
return '>';
break;
case '#':
return '<';
break;
}
}
//运算
double Operate(double a,double b,char c){
switch(c){
case '+':
return a + b;
break;
case '-':
return a - b;
break;
case '*':
return a * b;
break;
case '/':
return a / b;
break;
}
}
int main(){
int i,len,n;
char str[1001];
while(gets(str) && strcmp(str,"0") != 0){
stack<char> OP;
stack<double> Num;
//#作为栈底元素
OP.push('#');
len = strlen(str);
//输入串要以'#'开始和结束
str[len] = '#';
n = 0;
for(i = 0;i < len || OP.top() != '#';){
//跳过空格
if(str[i] == ' '){
i++;
}
//数字
else if(str[i] >= '0' && str[i] <= '9'){
//提取运算数
while(str[i] >= '0' && str[i] <= '9'){
n = n * 10 + str[i] - '0';
i++;
}
//数字入栈
Num.push(n);
n = 0;
}
//运算符
else{
//如果栈顶元素小,则把运算符压入栈
if(Precede(OP.top(),str[i]) == '<'){
OP.push(str[i]);
i++;
}
//如果栈顶元素大,则弹出栈顶运算符,再从数字栈弹出两个栈顶数字,完成运算,再把运算结果压入栈。
else if(Precede(OP.top(),str[i]) == '>'){
double b = Num.top();
Num.pop();
double a = Num.top();
Num.pop();
char c = OP.top();
OP.pop();
double result = Operate(a,b,c);
Num.push(result);
}
}
}//for
printf("%.2f\n",Num.top());
}//while
return 0;
}