RPN计算器c ++问题

时间:2014-05-06 19:02:45

标签: c++ stack calculator rpn

我需要创建一个对输入文件进行操作的RPN计算器。它使用4个标准算术运算符以及pow和%。我不确定为什么以下程序不适用于最后4个输入行。我得到了最后4行的“SYNTAX ERROR”输出。任何想法或建议?我使用的示例输入.txt文件是:

3 4 5.0 * -

7

4 * 8 30 +

香蕉

9 10 + 30 -

  1. 7 3- + 2 -3 +
  2. 900 40.65-20 +

    45.2 23.999%

    10 pow 2

    正确的输出应为:

    -17

    7

    语法错误

    语法错误

    -11

    9

    879.35

    21.201

    100

    #include<iostream>
    #include<fstream>
    #include<string>
    #include<stack>
    #include<sstream>
    #include<math.h> //pow
    #define SPACE(b) if (!(b)) throw "";
    using namespace std;
    double evalrpn(stack<string> & tkline);
    int main(void){
    
        string line;
        ifstream inputfile;
        string fileloc;
    one:cout << "Enter the location of the input file: ";
        getline(cin, fileloc);
        inputfile.open(fileloc);
        while (inputfile.fail())
        {
            cout << "The file at location " << fileloc << " failed to open." << endl;
        goto one;
    }
    while (getline(inputfile, line)){
        stack<string> tkline;
        istringstream sstr(line);
        string tk;
        while (sstr >> tk)
            tkline.push(tk);
        if (!tkline.empty())
            try {
            auto z = evalrpn(tkline);
            SPACE(tkline.empty());
            cout << z << endl;
        }
        catch (...) { cout << "SYNTAX ERROR" << endl; }
        }
    
    
    cin.ignore();
    return 0;
    }
    
    double evalrpn(stack<string> & tkline){
    SPACE(!tkline.empty());
    double x, y;
    auto tk = tkline.top();
    tkline.pop();
    auto n = tk.size();
    if (n == 1 && string("+-*/%'pow'").find(tk) != string::npos) {
        y = evalrpn(tkline);
        x = evalrpn(tkline);
        if (tk[0] == '+') x += y;
        else if (tk[0] == '-') x -= y;
        else if (tk[0] == '*') x *= y;
        else if (tk[0] == '/') x /= y;
        else if (tk[0] == '%') x = fmod(x,y);
        else pow(x, y);
    }
    else {
        unsigned i; x = stod(tk, &i);
        SPACE(i == n);
    }
    
    return x;
    }
    

1 个答案:

答案 0 :(得分:1)

您的程序无法处理令牌之间没有空格的情况,因为istringstream无法处理您的情况。您将不得不使用更智能的解析器,而不是使用空格分割为令牌。