式評価(ツリーメソッド/C++言語記述)(一)
11466 ワード
演算式(以下、式と略す)を二叉木で求め、実質的には式を二叉木に変換して後順に遍歴し、接尾辞式を得ると同時に式の値を求めることができる.変換と評価の過程もデータ構造スタックの助けを借りる必要がある.
ツリーデータ構造では、2つのクラス、ツリーノードクラス(BinaryTreeNode)、およびツリークラス(BinaryTree)を宣言する必要があります.この2つのクラスはテンプレートクラスです.
BinaryTreeクラスはBinaryTreeNodeクラスのプライベートメンバーにアクセスする必要があるため、BinaryTreeNodeクラスで友元クラスとして宣言する必要があります.また,2つのクラス間にループ依存性があるため,BinaryTreeNodeクラスの前に前方向参照宣言を加える必要がある.BinaryTreeクラスのメソッドの大部分は二叉木の遍歴に基づいており、メソッド体は比較的短いと同時に、コンパイルエラーを防止するために、直接メソッドの実装をクラス宣言に書く.preOrder()メソッド、inOrder()メソッド、postOrder()メソッドは、BinaryTreeクラスのサブクラスで書き換える必要があるため、虚関数として定義されます.
転載先:https://www.cnblogs.com/lets-blu/p/7281917.html
ツリーデータ構造では、2つのクラス、ツリーノードクラス(BinaryTreeNode)、およびツリークラス(BinaryTree)を宣言する必要があります.この2つのクラスはテンプレートクラスです.
1 #ifndef BINARYTREE_H
2 #define BINARYTREE_H
3
4 template class BinaryTree;
5
6 template
7 class BinaryTreeNode
8 {
9 public:
10 friend class BinaryTree;
11 T _data;
12
13 private:
14 BinaryTreeNode * _leftChild;
15 BinaryTreeNode * _rightChild;
16 };
17
18 template
19 class BinaryTree
20 {
21 public:
22 BinaryTree()
23 {
24 _root = nullptr;
25 }
26
27 ~BinaryTree()
28 {
29 destory();
30 }
31
32 void preOrder()
33 {
34 preOrder(_root);
35 }
36
37 void inOrder()
38 {
39 inOrder(_root);
40 }
41
42 void postOrder()
43 {
44 postOrder(_root);
45 }
46
47 protected:
48 BinaryTreeNode * _root;
49
50 void destory()
51 {
52 if (_root)
53 {
54 destory(_root);
55 delete _root;
56 }
57 }
58
59 void destory(BinaryTreeNode * node)
60 {
61 if (node)
62 {
63 destory(node->_leftChild);
64 destory(node->_rightChild);
65 // visit binary tree data
66 if (node->_leftChild)
67 {
68 delete node->_leftChild;
69 }
70 if (node->_rightChild)
71 {
72 delete node->_rightChild;
73 }
74 }
75 }
76
77 virtual void preOrder(BinaryTreeNode * node)
78 {
79 if (node)
80 {
81 // visit binary tree data
82 preOrder(node->_leftChild);
83 preOrder(node->_rightChild);
84 }
85 }
86
87 virtual void inOrder(BinaryTreeNode * node)
88 {
89 if (node)
90 {
91 inOrder(node->_leftChild);
92 // visit binary tree data
93 inOrder(node->_rightChild);
94 }
95 }
96
97 virtual void postOrder(BinaryTreeNode * node)
98 {
99 if (node)
100 {
101 postOrder(node->_leftChild);
102 postOrder(node->_rightChild);
103 // visit binary tree data
104 }
105 }
106 };
107
108 #endif // BINARYTREE_H
BinaryTreeクラスはBinaryTreeNodeクラスのプライベートメンバーにアクセスする必要があるため、BinaryTreeNodeクラスで友元クラスとして宣言する必要があります.また,2つのクラス間にループ依存性があるため,BinaryTreeNodeクラスの前に前方向参照宣言を加える必要がある.BinaryTreeクラスのメソッドの大部分は二叉木の遍歴に基づいており、メソッド体は比較的短いと同時に、コンパイルエラーを防止するために、直接メソッドの実装をクラス宣言に書く.preOrder()メソッド、inOrder()メソッド、postOrder()メソッドは、BinaryTreeクラスのサブクラスで書き換える必要があるため、虚関数として定義されます.
転載先:https://www.cnblogs.com/lets-blu/p/7281917.html