我想在阅读优先权归档后解决这类表达式
的 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;
}
答案 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)
您的代码存在许多问题
在那里隐藏了一个索引越界错误,在循环的第一次迭代中你试图访问read [-1]内存地址,这可能是不存在的
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')
你不应该将浮点除法的结果存储回read [i-1],因为很明显你是将浮点值与chars混合。如果你真的想要这样做,你应该把你的操作结果转换成一个字符串,但我敢说这是一个不必要的复杂性:你为什么不简单地使用一个浮点临时变量来存储部分结果?
在使用前两个操作数之后,绝对没有必要缩小读缓冲区内容,只需推进指针即可。