【问题标题】:C++ postfix notation - evaluationC++ 后缀表示法 - 评估
【发布时间】:2020-05-16 09:11:14
【问题描述】:

自从我使用 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

【问题讨论】:

  • 这段代码应该做什么?你能给出一个更短的简单例子吗?
  • push_backpop_back 不存在 std::stack,它应该是 pushpopoperator[] 也没有。此代码不应编译,看起来一半代码使用向量,一半使用堆栈。
  • 55 5 + 2 * 应该做例如 (55 + 5) * 2。@john 它曾经是向量
  • 减法和除法的操作数以错误的顺序压入堆栈。您必须在评估期间对此进行补偿。
  • 你能解释一下吗?

标签: c++ postfix-notation


【解决方案1】:

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

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

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

一个解决方案是这样的

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

使用调试器我花了两分钟才弄清楚这一点。也许是时候你学会了如何使用一个?

【讨论】:

  • 非常感谢 :) 是的,实际上我既不是使用 c++ 也不是使用代码块的人。这只是一些学校的东西。但是非常感谢:)
【解决方案2】:
        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 循环条件。

【讨论】:

  • 好的,我解决了这个问题,但仍然无法按预期工作。 55 5 - 2 * 如果 100 则返回 10... 这意味着它不像:读取数字直到到达运算符。所以缓冲区应该是 55,5 然后有操作员所以它应该需要 55 和 5 做:55-5 (缓冲区现在是空的)并将结果放入缓冲区,所以它只会在那里 50。然后它读取 2,因此缓冲区中有 50 和 2,然后当到达 * 时,它从缓冲区中弹出 2 个数字(缓冲区现在为空)并将它们相乘并将结果放入。所以最后缓冲区中应该只有 100 :(
猜你喜欢
  • 1970-01-01
  • 2014-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 2018-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多