1

私は 2 つの別個のプログラムを持っており、どちらも infix と postfix を使用して式ツリーを評価しています。1 つは構造に基づいており、もう 1 つはクラスに基づいています。今、私は次のように言っている(クラスバージョンの)割り当ての部分に固執しています:

「createExpressionTree() メソッドの実装を終了する」

そしてそれ

「構造 TreeNode」のインスタンスの代わりに「クラス ツリー」のインスタンスを使用する点を除いて、以前の実装と非常に似ています。

両方には以下よりも多くのことがありますが、要点を理解できると思いますので、私が尋ねているのは、クラスの実装は構造体の実装にどの程度似ているかということです。また、以下に示す古いコードをコピーして貼り付け、微調整を行うことはできますか? 私は試してきましたが、プライベートメンバーなどへのアクセスに問題があります。

これがクラス ツリーと、それに対応するはずの createExpressionTree の新しいバージョンです。

#ifndef TREE_H
#define TREE_H

#include <vector>
#include <stack>
#include <sstream>
#include <map>
# define TYPE_NUMBER 0
# define TYPE_VARIABLE 1
# define TYPE_OPERATOR 2



class Tree
{
public:
Tree(std::string input,Tree *leftSubTree=NULL,Tree *rightSubTree=NULL);
Tree(const Tree &inTree);   //COPY CONSTRUCTOR
~Tree(); //DESTRUCTOR

int evaluate(std::map< std::string, int > ipMap); //EVALUATE THE EXPRESSION
void postOrderPrint();
void inOrderPrint();

private:
Tree *leftPtr;
std::string Op;
Tree *rightPtr;
int NodeType;

};

ツリークラスに関連付けられたコード

Tree::Tree(std::string input,Tree *leftSubTree,Tree *rightSubTree){
Op = input;
leftPtr = leftSubTree;
rightPtr = rightSubTree;
int num;
if (input == "+"|input == "-"|input == "*"|input == "/")
            NodeType = TYPE_OPERATOR;
else if(std::istringstream(Op)>>num)
    NodeType = TYPE_NUMBER;
else
    NodeType = TYPE_VARIABLE;
}
// copy constructor

Tree::Tree(const Tree &inTree){
Op = inTree.Op;
NodeType = inTree.NodeType;

if (inTree.leftPtr == NULL){
   leftPtr = NULL;
}
else {
   leftPtr =  new Tree(*(inTree.leftPtr));
}
if (inTree.rightPtr == NULL){
   rightPtr = NULL;
}
else {
   rightPtr =  new Tree(*(inTree.rightPtr));
}
}


// tree destructor

Tree::~Tree(){
std::cout << "Tree destructor called" << std::endl;

if (leftPtr != NULL) {
    delete(leftPtr);
    leftPtr = NULL;
}
if (rightPtr != NULL) {
    delete(rightPtr);
    rightPtr = NULL;
}

}

#endif

新しい createExpressionTree について教えてください。

void arithmetic_expression::createExpressionTree(std::vector<std::string> expression)
{
std::stack <Tree> localStack;
std::string Op;
//Very similar to old implementation 
} 

そして、これが構造 treeNode の以前の実装と、完成した以前の createExpressionTree です。

struct treeNode {
treeNode *leftPtr;     /* pointer to left subtree */
std::string Op;                     /* integer data value */
treeNode *rightPtr;    /* pointer to right subtree */
};
typedef struct treeNode TreeNode;
typedef TreeNode * TreeNodePtr;

以前の createExpressionTree

void arithmetic_expression::createExpressionTree(std::vector<std::string> expression)
{
std::stack <TreeNodePtr> localStack;
std::string Op;
TreeNodePtr ptr;

for(int i=0; i<expression.size();i++)
{

    Op = expression[i];

    ptr = createNewTreeNode(Op);

    if(char_is_operator(Op))
    {

        // adding element to right tree
        if (localStack.empty())
        {
            std::cout<< "Invalid expression: tree not created  " << std::endl;
            topPtr = NULL;
            return;
        }
        else
        {
            ptr->rightPtr = localStack.top();
            localStack.pop();
        }

        // adding element to left tree
        if (localStack.empty()) {
            std::cout<< "Invalid expression: tree not created  " << std::endl;
            topPtr = NULL;
            return;
        }
        else
        {
            ptr->leftPtr = localStack.top();
            localStack.pop();
        }

    }
    // pushing element to stack
    localStack.push(ptr);
}

if (localStack.empty()) {
    std::cout<< "Invalid expression: tree not created  " << std::endl;
    topPtr = NULL;
}
else
{
    topPtr = localStack.top();
    localStack.pop();
    if (!localStack.empty()) {
        std::cout<< "Invalid expression: tree not created  " << std::endl;
        topPtr = NULL;
    }

}


}
4

1 に答える 1

1

クラスと構造のバージョンに違いはないと思います(構造体とクラスの唯一の違いは、クラスがデフォルトでデータを非公開にすることです)。

彼が「struct」という単語を「class」に変更することだけを望んでいる場合は、アクセス修飾子「public」を使用して leftPtr/rightPtr にアクセスできます。

例:

struct blah
{
  int boringNumbers;
  string boringStrings;
};

以下と同じです:

class blah2
{
public:
  int boringNumbers;
  string boringStrings;
};

しかし、彼は、より多くのコードをクラスに移動するようにアプリケーションを設計することも望んでいるかもしれません。

これには、少なくともchar_is_operator、クラスへの移動などの機能が含まれます。

私はそれを疑いますが、データを汎用文字列として保存する必要がないように、ノードの階層を作成することも望んでいるかもしれません。

于 2012-05-05T02:34:10.813 に答える