在运算符中搜索cstring

时间:2012-10-03 18:13:21

标签: c++ character cstring

对于作业,我们给出了反向抛光表示法的等式。对于此示例,我将使用:2 3 8 * + $ $用于表示表达式的结尾。使用堆栈,我们输出答案。

我一直在使用:

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

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

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

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

现在是我遇到的问题。如果我遇到一个操作符(在这种情况下为*),我需要从堆栈中弹出前两个元素并“操作它们”并将结果推回堆栈。但是,我不知道有什么能让我认识到他们是运营商。这可能是一个愚蠢的问题,但非常感谢帮助。

4 个答案:

答案 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();