PTA 5-21 求前缀表达式的值(25)- 线性表 - 堆栈 - 递归
题目:http://pta.patest.cn/pta/test/15/exam/4/question/836
PTA - 数据结构与算法(中文) - 5-21
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。
输入格式说明:
输入在一行内给出不超过30个字符的前缀表达式,只包含+、-、*、\以及运算数,不同对象(运算数、运算符号)之间以空格分隔。
输出格式说明:
输出前缀表达式的运算结果,精确到小数点后1位,或错误信息“ERROR”。
样例输入与输出:
#include <iostream> #include <cstdlib> #include <cstdio> using namespace std; double exp() //!返回前缀表达式的值 { char a[10]; //!用于存储第一个非空格字符 cin >> a; if(!a[1]) { //!a[1]为空,只有一位,即运算符或者数字0-9 switch(a[0]) { //!递归 case '+': return exp() + exp(); case '-': return exp() - exp(); case '*': return exp() * exp(); case '/': { double fenzi=exp(); double fenmu=exp(); if(fenmu!=0) return fenzi / fenmu; else{ cout << "ERROR"; exit(0); //!程序结束 } } default : return atof(a); //!将字符串转化成浮点数 } } else { //!a[1]不为空,不是运算符,是操作数 if(a[0]=='-' || a[0]=='+') //!带符号的数 { char flag=a[0]; //!记录符号 int i=0; while(a[i]){ //!覆盖符号 a[i]=a[i+1]; i++; } if(flag=='-') return 0-atof(a); else return atof(a); } else //!不带符号的数 return atof(a); } } int main() { printf("%.1f",exp()); //!保留一位小数 return 0; }