代码:
#include <iostream>
#include <cstring>
#include "stack.h"
using namespace std;
class TNode {
public:
int num;
char opt;
TNode *left, *right;
TNode(int n) { num = n; opt = '#'; left = right = nullptr; }
TNode(char c) { num = -1; opt = c; left = right = nullptr; }
};
class Tree {
public:
Tree() { root = nullptr; }
Tree(TNode* p) { root = p; }
void inorder() { inorder(root); }
void postorder() { postorder(root); }
protected:
void inorder(TNode *p);
void postorder(TNode *p);
private:
TNode* root;
};
void visit(TNode* p) {
if (p->opt == '+' || p->opt == '-' || p->opt == '*' || p->opt == '/')
cout << p->opt << " ";
else
cout << p->num << " ";
}
void Tree::inorder(TNode *p) {
if (p != nullptr) {
inorder(p->left);
visit(p);
inorder(p->right);
}
}
void Tree::postorder(TNode *p) {
if (p != nullptr) {
postorder(p->left);
postorder(p->right);
visit(p);
}
}
TNode* transverse(char s[]) {
Stack<TNode*> S;
int temp = 0;
for (int i = 0; i < strlen(s); i++) {
if (s[i] >= '0' && s[i] <= '9') { // 遇到数字
temp += s[i] - '0';
if (s[i + 1] >= '0' && s[i + 1] <= '9')
temp *= 10;
else {
TNode *p = new TNode(temp);
temp = 0;
S.push(p);
}
}
else if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/') { // 遇到运算符号
TNode *q = new TNode(s[i]);
q->right = S.pop();
q->left = S.pop();
S.push(q);
if (s[i + 1] == '\0')
return q;
}
}
}
int main() {
char s[100];
cin.getline(s, 100);
TNode* p = transverse(s);
Tree T = p;
T.inorder();
return 0;
}
运行结果: