0

大家好,我在获取输入时遇到了加号问题。我在这里处理反向波兰符号计算器。我所要做的是将输入作为“3 2 + $”,这意味着(以一种简单的方式)添加 3 和 2 并显示它们。我尝试使用字符串流,而(cin)。现在我正在尝试一一获取输入;

int num;
char ch;
while (cin)
    {
        if (cin >> num)
        {
            cout<<num;
        }
        else
        {
            cin.clear();
            cin >> ch;
            cout << ch;
        }
    }
}

它不适用于 + 和 - 并且适用于 * 和 /。但我也需要这些操作数。我通过getline尝试了istringstream。它也没有看到+或-。

4

1 回答 1

2

在您的示例代码中,这一行让我担心while (cin)(必须确定您会有无限循环),在下面的示例代码中(我补充说,当输入一个空行时程序结束)。

cin 将逐字获取输入,当您在控制台中写入3 2 + $时,您cin >> somevariable;会得到 4 个结果:3然后2然后+和最后$。阅读波兰符号时的另一个问题是,您无法预测下一个标记是数字还是运算符,您可能会得到:3 2 + $3 2 2 + * $也是。出于这个原因,您需要一个容器来存储操作数。

这是一个小的工作示例:

#include <iostream>
#include <stack>
#include <boost/lexical_cast.hpp>

using namespace std;

int main(int argc, char *argv[]) {
    string read;
    std::stack<int> nums;
    while (cin >> read) {
        if (read.empty()) {
            break;
        }
        else if (read == "$") {
            std::cout << nums.top() << std::endl;
        }
        else if (read == "+" || read == "-" || read == "*" || read == "/") {
            if (nums.size() < 2) {
            } // error code here

            int n1 = nums.top();
            nums.pop();
            int n2 = nums.top();
            nums.pop();

            if (read == "+")
                nums.push(n2 + n1);
            if (read == "-")
                nums.push(n2 - n1);
            if (read == "*")
                nums.push(n2 * n1);
            if (read == "/")
                nums.push(n2 / n1);
        }
        else {
            try {
                nums.push(boost::lexical_cast<int>(
                    read)); // you should add convertion excepcion code
            }
            catch (...) {

            }
        }
    }

    return 0;
}
于 2014-07-19T20:57:51.403 回答