C++后缀符号--评估

问题描述 投票:0回答:1

自从我使用C++工作以来,已经有相当一段时间了,我正在努力解决postfix符号。看来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;
}

on input: 55 5 - 2 *

输出。

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

看来正确的数字被放置在步骤nr2中,但看起来缓冲区也是nr5的。

c++ postfix-notation
1个回答
1
投票

所以问题是在 - 的输入。下一个字符是一个空格,所以你要输入这个密码

    } 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 = "";
    }

我花了两分钟的时间用调试器弄明白了这个问题。也许你该学学如何使用调试器了?


0
投票
        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循环条件。

© www.soinside.com 2019 - 2024. All rights reserved.