2

对于一个作业,我们给出了一个反向波兰符号的方程。对于这个例子,我将使用:2 3 8 * + $ is$用于表示表达式的结尾。使用堆栈,我们输出答案。

我一直在使用:

getline(cin, input, '&');
input.c_str();

读入方程式,然后将其转换为 c_string,这样我就可以查看输入中的各个元素。

之后,我需要检查一些事情。如果元素是数字,我需要将其推入堆栈。如果是空白,我需要跳过它。

if (isdigit(input[i]))
{
    push();
    i++;
}
else if (isspace(input[i]))
{
    i++;
}

现在是什么让我卡住了。如果我点击一个运算符(在这种情况下*),我需要从堆栈中弹出顶部的两个元素并“操作它们”并将结果推回堆栈。但是,我不知道有什么可以让我认识到他们是操作员。这可能是一个愚蠢的问题,但我们将不胜感激。

4

4 回答 4

1

您可以创建一个函数映射,并匹配运算符

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);
    }

这样,您将能够轻松地将新运算符添加到您的计算器中。

于 2012-10-03T18:22:16.703 回答
0

只有大约 4 或 5 个操作员。用类似的东西检查它们:

if (input[i] == '*') {...}
于 2012-10-03T18:16:01.643 回答
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;
}

如果你有多字符运算符,比如'==',它会变得有点复杂,因为你必须往前看,但想法是一样的。

于 2012-10-03T18:19:32.733 回答
0

如果您正在编写反向波兰符号计算器,那么在堆栈上您只有数字,或者像您的示例中那样的数字。顺便说一句,您不接受多位数字吗?

考虑两种情况,在这两种情况下你只需要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(); 
于 2012-10-03T20:51:56.717 回答