C ++优先通过归档

时间:2016-03-15 07:40:54

标签: c++ c++11 visual-c++

我想在阅读优先权归档后解决这类表达式
2 + 3/5 * 9 + 3-4
这是我尝试解决该任务的代码,我该如何解决这个问题

while ( !inputFile.eof() ) {
  getline( inputFile, read );
  cout << read << endl;
  for ( int i = 0; i < read.length(); i++ ) {
    if ( read[i] == '/' ) {
      result = static_cast<float>(read[i - 1]) / static_cast<float>(read[i + 1]);
      read[i - 1] = result;
      for ( int j = i; j < read.length() - 2; j++ ) {
        read[j] = read[j + 2];
      }
      read[read.length() - 1] = '\0';
      read[read.length() - 2] = '\0';
    }
  }
  cout << result << endl;
  cout << read << endl;
}

2 个答案:

答案 0 :(得分:2)

您需要根据输入构建树状结构。首先,你需要lex(/ tokenize)你的等式,这样你就得到了一个List / Array /你认为适合你的标记的任何容器(数字,运算符,括号)。这些可能已经拥有正确的数据类型(数字等等为float或int)。

然后,您可以使用正确的优先级将令牌解析为树状结构。这是构建类似计算器的应用程序的棘手部分。

基本上你在这里解析一个语法,但你应该自己考虑一下(这是一个很好的做法)。

2 + 3/5 * 9 + 3-4 的树形结构需要如下所示:

MINUS
|- PLUS
|  |- PLUS
|  |  |- 2
|  |  |- MULTIPLY
|  |  |  |- DIVIDE
|  |  |  |  |- 3
|  |  |  |  |- 5
|  |  |  |- 9
|  |- 3
|- 4

答案 1 :(得分:1)

您的代码存在许多问题

  1. 在那里隐藏了一个索引越界错误,在循环的第一次迭代中你试图访问read [-1]内存地址,这可能是不存在的

  2. read(大概)是一个chars数组,这意味着read [i]包含一个ASCII字符,而不是一个原始数字。因此,如果read [i]包含'5',则应用static_cast&lt; float&gt;(read [i])的结果为'53 .0',因为'5'的ASCII代码为53.所以你真正需要的是static_cast&lt; float&gt ;(读[i] - '0')

  3. 你不应该将浮点除法的结果存储回read [i-1],因为很明显你是将浮点值与chars混合。如果你真的想要这样做,你应该把你的操作结果转换成一个字符串,但我敢说这是一个不必要的复杂性:你为什么不简单地使用一个浮点临时变量来存储部分结果?

  4. 在使用前两个操作数之后,绝对没有必要缩小读缓冲区内容,只需推进指针即可。