嗨,我们在获取输入时遇到加号困难。我在这里处理反向抛光符号计算器。我必须采取的是" 3 2 + $"这意味着(以一种简单的方式)添加3和2并显示它们。我尝试使用stringstreams,而(cin)。现在我试图逐个输入;
int num;
char ch;
while (cin)
{
if (cin >> num)
{
cout<<num;
}
else
{
cin.clear();
cin >> ch;
cout << ch;
}
}
}
它对+和 - 不起作用,适用于*和/。但我也需要那些操作数。我通过getline尝试了istringstream。它没有看到+或 - 或者。
答案 0 :(得分: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;
}