题目描述: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。 输入: 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。 输出: 对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。 样例输入: 1 + 2 4 + 2 * 5 - 7 / 11 0 样例输出: 3.00 13.36
AC代码:
#include <iostream>
#include <cstdio>
#include <stack>
#include <vector>
#include <cstdlib>
using namespace std;
string str;
vector<string> latter,mid;
stack<string> s;
stack<double> caculate;
//栈外优先级
int icp(char ch)
{
int result = 0;
if(ch == '#'){
result = 0;
}
if(ch == '*'||ch == '/'){
result = 4;
}
if(ch == '+'||ch == '-'){
result = 2;
}
return result;
}
//栈内优先级
int isp(char ch)
{
int result = 0;
if(ch == '#'){
result = 0;
}
if(ch == '*'||ch == '/'){
result = 5;
}
if(ch == '+'||ch == '-'){
result = 3;
}
return result;
}
//生成中缀表达式
void Median()
{
for(int i = 0 ; i < str.length() ; i++){
if(str[i] >= '0' && str[i] <= '9'){
int j;
for(j = i ; j < str.length() ; j++){
if(str[j]>= '0' && str[j] <= '9'){
continue;
}else{
break;
}
}
mid.push_back(string(str,i,j-i));
i = j-1;
}else if(str[i] == ' '){
continue;
}else{
mid.push_back(str.substr(i,1));
}
}
mid.push_back(string(1,'#'));
}
//生成后缀表达式
void Latter()
{
s.push(string(1,'#'));
for(int i = 0 ; i < mid.size() ; i++){
//是数字直接追加大后缀表达式
if(mid[i][0] >= '0' && mid[i][0] <= '9'){
latter.push_back(mid[i]);
}else{//是运算符
//栈顶元素的优先级小于栈外元素的优先级,栈外元素入栈
string ch = s.top();
if(isp(ch[0]) < icp(mid[i][0])){
s.push(string(mid[i]));
}else if(isp(ch[0]) > icp(mid[i][0])){
//栈顶元素的优先级大于栈外元素的优先级,栈顶元素出栈到后缀表达式
latter.push_back(ch);
s.pop();
i--;
}else{//栈顶元素的优先级到等于栈外元素的优先级 ,说明遍历到"#",结束
s.pop();
}
}
}
}
int main()
{
while(1){
mid.clear();
latter.clear();
str.clear();
getline(cin,str);
if(str[0] == '0'){
break;
}
Median();
Latter();
for(int i = 0 ; i < latter.size() ; i++){
if(latter[i][0] >= '0' && latter[i][0] <= '9'){
double num = atof(latter[i].c_str());
caculate.push(num);
}else{
double b = caculate.top();
caculate.pop();
double a = caculate.top();
caculate.pop();
double c;
switch(latter[i][0]){
case '+': c = a + b;break;
case '-': c = a - b;break;
case '*': c = a * b;break;
case '/': c = a / b;break;
}
caculate.push(c);
}
}
double result = caculate.top();
caculate.pop();
printf("%.2f\n",result);
}
return 0;
}