我目前正在为二叉树编写c ++。然而,整个事情是写的,无论我想要评估什么表达式,我都会让命令提示符告诉我-1。#IND。关于修复此问题的任何想法,甚至是什么意思?
提前致谢
代码:
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
template<typename T> struct TreeNode
{
TreeNode(const T& value, TreeNode<T>* left = NULL, TreeNode<T>* right = NULL)
{
Value = value;
Left = left;
Right = right;
}
T Value;
TreeNode<T>* Left;
TreeNode<T>* Right;
bool IsLeaf() const
{
return Left == NULL && Right == NULL;
}
};
double ValueOf(TreeNode<char>* treeNode)
{
if ( treeNode->IsLeaf() )
{
return treeNode->Value - '0';
}
else
{
switch(treeNode->Value)
{
case '+':
return ValueOf(treeNode->Left) + ValueOf(treeNode->Right);
break;
case '-':
return ValueOf(treeNode->Left) - ValueOf(treeNode->Right);
break;
case '*':
return ValueOf(treeNode->Left) * ValueOf(treeNode->Right);
break;
case '/':
return ValueOf(treeNode->Left) / ValueOf(treeNode->Right);
break;
}
}
}
void main()
{
string expression;
cout << "Please enter an expression: ";
cin >> expression;
TreeNode<char> *newLeaf;
TreeNode<char> *treeRoot;
TreeNode<char> *currentNode;
TreeNode<char> *newRoot;
TreeNode<char> *newChild;
treeRoot = NULL;
currentNode = treeRoot;
for (int i = 0; i < expression.length(); i++)
{
if ( (expression[i] >= 0 ) || ( expression[i] <= 9 ) )
{
newLeaf = new TreeNode <char> (expression[i]);
if ( currentNode == NULL)
{
treeRoot = currentNode = newLeaf;
}
else
{
currentNode->Right = newLeaf;
}
}
else if ( (( expression[i] == '+' || expression[i] == '-') || (expression[i] == '*' || expression[i] == '/' )) && currentNode->Right == NULL )
{
newRoot = new TreeNode <char> (expression[i]);
newRoot->Left = treeRoot;
treeRoot = newRoot;
currentNode = newRoot;
}
else if (expression[i] == '*' || expression[i] == '/')
{
newChild = new TreeNode <char> (expression[i]);
newChild->Left = currentNode->Right;
currentNode->Right = newChild;
currentNode = newChild;
}
}
double result = ValueOf(treeRoot);
cout << "The result is: " << result << endl;
system("pause");
}
答案 0 :(得分:3)
如果恰好传递了不是叶子的东西并且没有四个算术运算字符中的一个值,那么你的ValueOf
函数将默默地返回随机废话。在这种情况下,试图显示随机的废话会产生各种疯狂的结果。如果其余代码保证不会发生这种情况,那就无所谓了。不幸的是......
我认为 - 用于解析表达式的代码可以很容易地生成这样的东西。例如,假设您输入表达式12
。然后首先创建一个仅包含1
的节点;然后创建一个2
并成为1
节点的正确子项。这意味着后者不再被视为叶子。邦。
现在,当然,这不是你想到的那种表达方式。那么,当你输入1+2
时,为什么它不能正常工作呢?好吧,这是杀死你的主要因素:
if ( (expression[i] >= 0 ) || ( expression[i] <= 9 ) )
应该是&&
,而不是||
。所以你的解析器的其他部分永远不会被使用! (当然,你最终会得到一棵没有任何意义的树。)
答案 1 :(得分:2)
这意味着您对double
或float
执行非法操作(例如取负数的sqrt)。另见:http://www.johndcook.com/IEEE_exceptions_in_cpp.html