对于作业,我们给出了反向抛光表示法的等式。对于此示例,我将使用:2 3 8 * + $
$
用于表示表达式的结尾。使用堆栈,我们输出答案。
我一直在使用:
getline(cin, input, '&');
input.c_str();
读入等式然后将其转换为c_string,以便我可以查看输入中的各个元素。
之后,我需要检查一些事情。如果元素是数字,我需要将其推入堆栈。如果是空格,我需要跳过它。
if (isdigit(input[i]))
{
push();
i++;
}
else if (isspace(input[i]))
{
i++;
}
现在是我遇到的问题。如果我遇到一个操作符(在这种情况下为*
),我需要从堆栈中弹出前两个元素并“操作它们”并将结果推回堆栈。但是,我不知道有什么能让我认识到他们是运营商。这可能是一个愚蠢的问题,但非常感谢帮助。
答案 0 :(得分:1)
您可以创建函数map,并匹配运算符
std::map<char, void (*)(char *)> operators;
operators['*'] = &mult;
operators['+'] = &add;
...
并在您的条件声明中
if (isdigit(input[i]))
{
push();
i++;
}
else if (isspace(input[i]))
{
i++;
}
else if (operators.find(input[i]) != operators.end())
{
operators[input[i]](input);
}
这样,您就可以轻松地将新操作符添加到计算器中。
答案 1 :(得分:0)
只有大约4或5个运营商。用以下内容检查它们:
if (input[i] == '*') {...}
答案 2 :(得分:0)
嗯,没有“内置”方式。我只想写一个IsOperator(char ch)函数。然后做一些像:
int IsOperator(char ch)
{
// either add more operators or use a table, etc. here
if (ch == '+' || ch == '-' || ch == '/' || ch == '*')
return 1;
return 0;
}
如果你有多个字符操作符,比如'==',它会变得有点复杂,因为你必须向前看,但想法是一样的。
答案 3 :(得分:0)
如果您正在编写反向抛光符号计算器,那么在堆栈中您只有数字或数字,例如您的示例。 BTW你不接受多位数字吗?
考虑两种情况,只需要std::stack<int> numbers;
:
c
- 只需将数字放在堆栈上:代码:
numbers,push(c - '0');
代码:
if (numbers.size() < 2) {
throw std::runtime_error("Too little numbers for +");
}
int a = numbers.top();
numbers.pop();
numbers.top() += a;
代码:
if (numbers.size() != 1) {
throw std::runtime_error("There should be only one!");
}
int result = numbers.top();
numbers.pop();