【发布时间】:2010-10-08 01:59:55
【问题描述】:
正如主题所说,我对 c++ 很陌生,但我对 java 有一些经验。 为了开始学习 c++,我有制作一个简单的命令行计算器的(不是很原始的)想法。 我要做的是将数字和运算符存储在二叉树中。
#include <iostream>
using namespace std;
class Node
{
bool leaf;
double num;
char oper;
Node* pLNode;
Node* pRNode;
public:
Node(double n)
{
num = n;
leaf = true;
pLNode = 0;
pRNode = 0;
}
Node(char o, Node lNode, Node rNode)
{
oper = o;
pLNode = &lNode;
pRNode = &rNode;
leaf = false;
}
bool isLeaf()
{
return leaf;
}
double getNumber()
{
return num;
}
char getOperator()
{
return oper;
}
Node* getLeftNodePointer()
{
return pLNode;
}
Node* getRightNodePointer()
{
return pRNode;
}
//debug function
void dump()
{
cout << endl << "**** Node Dump ****" << endl;
cout << "oper: " << oper << endl;
cout << "num: " << num << endl;
cout << "leaf: " << leaf << endl;
cout << "*******************" << endl << endl;
}
};
class CalcTree
{
Node* pRootNode;
Node* pCurrentNode;
public:
Node* getRootNodePointer()
{
return pRootNode;
}
Node* getCurrentNodePointer()
{
return pCurrentNode;
}
void setRootNode(Node node)
{
pRootNode = &node;
}
void setCurrentNode(Node node)
{
pCurrentNode = &node;
}
double calculateTree()
{
return calculateTree(pRootNode);
}
private:
double calculateTree(Node* nodePointer)
{
if(nodePointer->isLeaf())
{
return nodePointer->getNumber();
}
else
{
Node* leftNodePointer = nodePointer->getLeftNodePointer();
Node* rightNodePointer = nodePointer->getRightNodePointer();
char oper = nodePointer->getOperator();
if(oper == '+')
{
return calculateTree(leftNodePointer) + calculateTree(rightNodePointer);
}
else if(oper == '-')
{
return calculateTree(leftNodePointer) - calculateTree(rightNodePointer);
}
else if(oper == '*')
{
return calculateTree(leftNodePointer) * calculateTree(rightNodePointer);
}
else if(oper == '/')
{
return calculateTree(leftNodePointer) / calculateTree(rightNodePointer);
}
}
}
};
int main(int argc, char* argv[])
{
CalcTree tree;
tree.setRootNode(Node('+', Node(1), Node(534)));
cout << tree.calculateTree() << endl;
return 0;
}
我有几个关于这段代码的问题:
这会编译,但不会执行预期的操作。似乎在 tree.setRootNode(Node('+', Node(1), Node(534))); 之后在 main 中,rightnode 已正确初始化,但 leftnode 未正确初始化。编译并运行它会为我打印出 534(gcc,freebsd)。这里有什么问题?
-
在 c++ 中,人们似乎更喜欢在类之外定义类的成员,例如
A 级 { 民众: 无效成员(); };
A :: member(){std::cout
这是为什么呢?
我非常想要一些关于 c++ 约定(命名、缩进等)的指针
我习惯用 eclipse 编写 java 代码。 Atm 我正在使用 emacs 来学习 c++。有人可以就一个好的(免费)c++ ide给我建议,还是我应该像一个真正的男人一样坚持使用emacs? :)
【问题讨论】:
-
为什么要将数字存储在二叉树中? :|
-
这不仅仅是将数字存储在二叉树中!
标签: c++