简单计算器
描述
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入描述:
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
输出描述:
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
示例1
输入: 1 + 2 4 + 2 * 5 - 7 / 11 0
输出: 3.00 13.36
方法一: 使用栈分别存储数据和运算符
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
#include<queue>
#include<stack>
#include<cctype>
#include <unordered_map>
using namespace std;
float getNum(string s, int& index){
float re = 0;
while(isdigit(s[index])){
re *= 10;
re += s[index] - '0';
index++;
}
return re;
}
float cal(float a, float b, char ch){
float re = 0;
switch(ch){
case '+': re = a + b; break;
case '-': re = a - b; break;
case '*': re = a * b; break;
case '/': re = a*(1.0) / b; break;
}
return re;
}
int main(int argc, char const *argv[])
{
string s;
unordered_map<char, int> prority;
prority['$'] = 0;
prority['#'] = 1;
prority['+'] = 2;
prority['-'] = 2;
prority['*'] = 3;
prority['/'] = 3;
while(getline(cin,s)){
if(s == "0") break;
int index = 0;
stack<char> op;
stack<float> data;
s += '#';
op.push('$');
while(index < s.size()){
if(s[index] == ' ')
index++;
else if(isdigit(s[index])){
float a = getNum(s, index);
data.push(a);
}else{
if(prority[s[index]] > prority[op.top()]){
op.push(s[index]);
index++;
}else{
float a = data.top();
data.pop();
float b = data.top();
data.pop();
char ch = op.top();
op.pop();
float tp = cal(b, a, ch);
data.push(tp);
}
}
}
printf("%.2f\n", data.top());
}
return 0;
}
方法二: 按照顺序从左到右遍历,遇到*/先计算,遇到±后计算。
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
#include<queue>
#include<stack>
#include<cctype>
#include <unordered_map>
using namespace std;
int main(int argc, char const *argv[])
{
double tmp;
char ch;
while(cin>>tmp){
if(tmp == 0) break;
double ans[201];
int index = 0;
ans[0] = tmp;
while(cin>>ch>>tmp){
cout<<ch<<tmp<<endl;
switch(ch){
case '+': ans[++index] = tmp;break;
case '-': ans[++index] = -tmp;break;
case '*': ans[index] *= tmp;break;
case '/': ans[index] /= tmp;break;
}
char c = cin.get();
cout<<c<<endl;
if(c =='\n') break;
}
double re = 0;
for (int i = 0; i < index+1; ++i)
{
cout<<ans[i]<<' ';
re += ans[i];
}
printf("%.2f\n", re);
}
return 0;
}
|