-
题目描述:
-
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
-
输入:
-
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
-
输出:
-
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
-
样例输入:
-
1 + 2 4 + 2 * 5 - 7 / 11 0
-
样例输出:
-
3.00 13.36
#include "string"
#include <iostream>
#include<iomanip>
#include <stack>
using namespace std;
string str;
unsigned int pos;
double getNum()
{
double v = 0;
for (; pos < str.length(); pos++)
{
if (str[pos] > '9' || str[pos] < '0')
{
break;
}
v *= 10;
v += str[pos] - '0';
}
return 1.0*v;
}
int main(int argc, char* argv[])
{
double a, b;
double v;
while (getline(cin,str))
{
//"1 + 2"
if (str.length()>200)
{
break;
}
stack<double> s;
pos = 0;
s.push(getNum());
if (str.length() == 1 && (str[0] - '0'== 0))
{
break;
}
while (pos < str.length())
{
switch (str[pos])
{
case '*':
pos=pos+2;
a = s.top();
s.pop();
b = getNum();
s.push(a*b);
break;
case '/':
pos=pos+2;
a = s.top();
s.pop();
b = getNum();
s.push(a / b);
break;
case '+':
pos=pos+2;
s.push(getNum());
break;
case '-':
pos=pos+2;
s.push(-1.0*getNum());
break;
case ' ':
pos++;
break;
default:
break;
}
}
v = 0;
while (!s.empty())
{
v += s.top();
s.pop();
}
cout << fixed << setprecision(2) << v << endl;//精确到小数点后两位
}
return 0;
}
/**************************************************************
Problem: 1019
User: EbowTang
Language: C++
Result: Accepted
Time:0 ms
Memory:1524 kb
****************************************************************/
注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!
原文地址:http://blog.csdn.net/ebowtang/article/details/50249989
原作者博客:http://blog.csdn.net/ebowtang