在 cstring 中搜索运算符

searching cstring for operators

本文关键字:运算符 搜索 cstring      更新时间:2023-10-16

对于作业,我们得到一个反向抛光符号的方程。对于此示例,我将使用: 2 3 8 * + $ $ 用于表示表达式的结尾。使用堆栈,我们输出答案。

我一直在使用:

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

读取等式,然后将其转换为c_string,以便我可以查看输入中的各个元素。

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

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

现在就是让我卡住的原因。 如果我命中一个运算符(在本例中是*),我需要从堆栈中弹出前两个元素并"操作它们"并将结果推回堆栈。 但是,我不知道有什么东西可以让我认识到他们是运营商。这可能是一个愚蠢的问题,但帮助将不胜感激。

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

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

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

只有大约 4 或 5 个运算符。 使用以下内容检查它们:

if (input[i] == '*') {...}

嗯,没有"内置"的方法。我只会写一个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;
}

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

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

考虑两种情况,在这两种情况下,您只需要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();