时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。 输入格式说明: 输入在一行内给出不超过30个字符的前缀表达式,只包含+、-、*、\以及运算数,不同对象(运算数、运算符号)之间以空格分隔。 输出格式说明: 输出前缀表达式的运算结果,精确到小数点后1位,或错误信息“ERROR”。 样例输入与输出: 序号 输入 输出 1 + + 2 * 3 - 7 4 / 8 4 13.0 2 / -25 + * - 2 3 4 / 8 4 12.5 3 / 5 + * - 2 3 4 / 8 2 ERROR 4 +10.23 10.2
如果你肯先采纳答案,可以给你一些代码
#include <iostream>
#include <list>
#include <stack>
#include <sstream>
#include <cstdlib>
using namespace std;
class node {
public:
double val;
char op;
bool is_op;
};
void parse(list<node*>&);
bool calc(list<node*> &tokens, double &result);
double calcx(double a, double b, char op);
void clear(list<node*> &tokens);
int main() {
list<node*> tokens;
parse(tokens);
double res = 0.0;
if (calc(tokens,res)) {
printf("%.1f\n", res);
} else {
cout<<"ERROR"<<endl;
}
clear(tokens);
//system("pause");
}
void clear(list<node*> &tokens) {
list<node*>::iterator iter = tokens.begin();
for(; iter != tokens.end(); iter++) {
delete *iter;
}
tokens.clear();
}
double calcx(double a, double b, char op) {
switch(op) {
case '+':return a+b;break;
case '-':return a-b;break;
case '*':return a*b;break;
case '/':return a/b;break;
default:return 0;
}
}
bool calc(list<node*> &tokens, double &result) {
stack<double> nums;
list<node*>::iterator iter = tokens.begin();
for (; iter != tokens.end(); iter++) {
node* n = *iter;
if (n->is_op) {
if (nums.size() < 2) {
return false;
} else {
double a = nums.top();
nums.pop();
double b = nums.top();
nums.pop();
if (n->op == '/' && b == 0) return false;
nums.push(calcx(a, b, n->op));
}
} else {
nums.push(n->val);
}
}
if (nums.size() != 1) {
return false;
} else {
result = nums.top();
return true;
}
}
bool is_op(char ch) {
return ch == '+' || ch == '-' || ch == '*' || ch == '/';
}
void parse(list<node*> &tokens) {
char buf[30];
stringstream stream;
double value = 0;
while(cin>>buf) {
node* n = new node();
if (buf[1] == 0 && is_op(buf[0])) { // operator
n->is_op = true;
n->op = buf[0];
} else { // number
stream.clear();
stream<<buf;
stream>>value;
n->val = value;
n->is_op = false;
}
tokens.push_front(n);
}
}