标签:
这道题用到了栈,所以就用C++来做咯
当然C也可以做,不过就显得麻烦了。
/*--------------------------------------*/
我们把这道题分成几个部分
1. 输入部分 怎么判断输入的是一个运算符还是一个数?
2. 计算部分 前缀表达式如何计算?在什么情况下我们可以说前缀表达式有错,而报出一个"ERROR"?
首先创建了一个表达式栈expression用来存表达式的内容
第一部分的思路是这样的,每次从输入流获取一个字符串string
1.如果string是加减乘除,就把运算符push进表达式栈
2.如果string不是加减乘除,那string一定是数,就把str2double(string)的值push进站,str2double是我自己写的一个把字符串转换成double类型数的函数
经过了以上操作,表达式栈expression里就装好了表达式的内容
第二部分,开始计算咯。首先创建一个运算数栈num
1.如果expression.top是数,则把此数加入num,再expression.pop
2.如果expression.top是加减乘除,则取出num栈顶的两个元素,进行运算,再把运算结果加入num栈
什么时候应该报错呢?
1. 被除数是0时
2. expression.top是加减乘除,但是num栈里的元素少于两个,说明少了运算数,就像中缀表达式的(5+)*3一样,无法进行运算时
3. expression已经空了,可是num里的元素比两个还多,说明少了运算符,就像中缀表达式的(5 3)*3一样,无法进行运算时
最后,贴上代码
#include <iostream> #include <cstdio> #include <stack> #include <string> using namespace std; typedef struct{ char operation; double value; }expr; double str2double(string get); void ERROR(); int main() { stack<expr> expression; string get; do{ cin >> get; if (get == "+" || get == "-" || get == "*" || get == "/"){ expression.push({ get.at(0), 0.0 }); } else{ expression.push({ ‘\0‘, str2double(get) }); } } while (getchar() != ‘\n‘); stack<double> num; while (expression.empty() != true){ if (expression.top().operation == ‘\0‘){ num.push(expression.top().value); } else{ if (num.size() < 2){ ERROR(); return 0; } double a, b, c; b = num.top(); num.pop(); a = num.top(); num.pop(); if (expression.top().operation == ‘/‘ && a == 0){ ERROR(); return 0; } switch (expression.top().operation) { case‘+‘:c = b + a; break; case‘-‘:c = b - a; break; case‘*‘:c = b*a; break; case‘/‘:c = b / a; break; } num.push(c); } expression.pop(); } if (num.size() >= 2){ ERROR(); return 0; } else{ printf("%.1lf", num.top()); } } double str2double(string get) { auto begin = get.begin(), end = get.end(); //符号处理 bool negative = false; if (*begin == ‘-‘){ negative = true; begin++; } else if (*begin == ‘+‘){ begin++; } //绝对值计算 double ret = 0; bool dot = false; double i = 10.0; while (begin != end){ //逗号检测 if (*begin == ‘.‘){ dot = true; begin++; continue; } //逗号前 if (dot == false){ ret *= 10; ret += *begin - ‘0‘; begin++; } //逗号后 else{ ret += ((*begin) - ‘0‘) / i; i *= 10; begin++; } } //符号处理 if (negative == true && ret != 0){ ret = -ret; } return ret; } void ERROR() { cout << "ERROR"; }
标签:
原文地址:http://www.cnblogs.com/zhouyiji/p/4554923.html