C++ 后缀表示法 - 评估

C++ postfix notation - evaluation

自从我使用 C++ 以来已经有一段时间了,我正在努力解决后缀表示法。看起来 pop 没有正常工作,数字没有被重写。

这是我的代码:

int main() {
    string input;
    string num = "";
    int i;
    int a,b,c;
    vector< int > numbers;
    getline(cin,input);
    for(i=0; i<input.length(); i++) {
        if(input[i] >= '0' && input[i] <= '9') { //creating multi digit number
            num.push_back(input[i]);
            if(i == input.length()) {
               istringstream(num) >> c;
                numbers.push(c);
            }
        } else if(input[i] == ' ') {
            istringstream(num) >> c;
            numbers.push(c);
            num = "";
        }
        if (input[i]=='+') {
            b = numbers[numbers.size() - 1];
            a = numbers[numbers.size() - 2];
            numbers.pop_back();numbers.pop_back();
            numbers.push_back(a+b));
            continue;
        }
        if (input[i]=='*') {
            b = numbers[numbers.size() - 1];
            a = numbers[numbers.size() - 2];
            numbers.pop_back();numbers.pop_back();
            numbers.push_back(a*b));
            continue;
        }
        if (input[i]=='/') {
            b = numbers[numbers.size() - 1];
            a = numbers[numbers.size() - 2];
            numbers.pop_back();numbers.pop_back();
            numbers.push_back(a/b));
            continue;
        }
        if (input[i]=='-') {
            b = numbers[numbers.size() - 1];
            a = numbers[numbers.size() - 2];
            numbers.pop_back();numbers.pop_back();
            numbers.push_back(a-b));
            continue;
        }
    }
    if(numbers.size() > 1 && i != input.length() -1) {
        return 0;
    }

    cout << numbers.top();
    return 0;
}

基本上看起来结果没有压入栈顶。例如 55 5 - 2 * 将像这样运行:

  1. 55 - 5
  2. 5 * 2(而不是 50 * 2)

所以我不确定 pop_back 或 push_back 是否不起作用;

有人可以给我提示吗?

更新:

我增强了代码:

#include <iostream>
#include <stack>
#include <cstring>
#include <string>
#include <sstream>
#include <vector>
using namespace std;

void print_numbers(vector <int> numbers, char op) {
    for(int i = 0; i < numbers.size(); i++){
        cout << op << ": " << numbers[i] << " ";
    }
    cout << endl;
}

int main() {
    string input;
    string num = "";
    int i;
    int a,b,c;
    vector< int > numbers;
    getline(cin,input);
    for(i=0; i<input.length(); i++) {
        if(input[i] >= '0' && input[i] <= '9') {
            num.push_back(input[i]);
            if(i == input.length() -1) {
               istringstream(num) >> c;
                numbers.push_back(c);
            }
        } else if(input[i] == ' ') {
            istringstream(num) >> c;
            numbers.push_back(c);
            num = "";
        }
        if (input[i]=='+') {
            b = numbers[numbers.size() - 1];
            a = numbers[numbers.size() - 2];
            numbers.pop_back();numbers.pop_back();
            numbers.push_back(a+b);
            continue;
        }
        if (input[i]=='*') {
            print_numbers(numbers,'*');
            b = numbers[numbers.size() - 1];
            a = numbers[numbers.size() - 2];
            numbers.pop_back();numbers.pop_back();
            numbers.push_back(a*b);
            print_numbers(numbers,'*');
            continue;
        }
        if (input[i]=='/') {
            b = numbers[numbers.size() - 1];
            a = numbers[numbers.size() - 2];
            numbers.pop_back();numbers.pop_back();
            numbers.push_back(a/b);
            continue;
        }
        if (input[i]=='-') {
            b = numbers[numbers.size() - 1];
            a = numbers[numbers.size() - 2];
            print_numbers(numbers,'-');
            numbers.pop_back();numbers.pop_back();
            numbers.push_back(a-b);
            print_numbers(numbers,'-');
            continue;
        }
    }

    print_numbers(numbers,' ');
    cout << numbers[numbers.size() - 1];
    return 0;
}

输入:55 5 - 2 *

输出:

1. -: 55 -: 5
2. -: 50
3. *: 50 *: 5 *: 2
4. *: 50 *: 10
5. : 50  : 10
6. 10

所以看起来正确的数字放在步骤 nr2 中。但看起来缓冲区也再次与 nr 5

        if (i == input.length()) {
           istringstream(num) >> c;
            numbers.push(c);
        }

应该是

        if (i + 1 == input.length()) {
           istringstream(num) >> c;
            numbers.push(c);
        }

i永远不会等于input.length(),看for循环条件

所以问题是输入中的 - 之后会发生什么。下一个字符是 space 所以你输入这个代码

    } else if(input[i] == ' ') {
        istringstream(num) >> c;
        numbers.push_back(c);
        num = "";
    }

您尝试将另一个数字压入堆栈的位置。但是 num 此时为空,这意味着 istringstream(num) >> c; 失败,因此变量 c 未更改。无论如何,下一行 c 都会被压入堆栈,但 c 仍然具有前一个数字的旧值 5。这解释了为什么您将相同的号码推迟两次。

一个解决方案是这样

    } else if(input[i] == ' ' && num != "") {
        istringstream(num) >> c;
        numbers.push_back(c);
        num = "";
    }

我花了两分钟时间才用调试器解决了这个问题。也许你学会了如何使用它?