#include <bits/stdc++.h> using namespace std; typedef string ElemType; typedef struct BitNode { ElemType data; struct BitNode *lchild,*rchild; } BitNode,*BiTree; //char sc[10]= {"+-*/"}; void CreateBiTree(BiTree &t) { string ch; cin >> ch; if(ch[0] == '#') t = NULL; else { t = new BitNode; t->data = ch; CreateBiTree(t->lchild); CreateBiTree(t->rchild); } } int InOrderTraverse(BiTree t) { string op = t->data; int a,b; if(op[0]<'0' || op[0]>'9') { cout << '('; a = InOrderTraverse(t->lchild); cout << t->data ; b = InOrderTraverse(t->rchild); cout << ')'; if(op == "+") return a+b; else if(op == "-") return a-b; else if(op == "*") return a*b; else return a/b; } else { //InOrderTraverse(t->lchild); cout << t->data; //InOrderTraverse(t->rchild); int num=0; for(int i=0;i<op.size();i++){ num = num*10 + op[i]-'0'; } return num; } } int main() { BiTree tree = new BitNode; string ch; int sum; while(cin >> ch) { tree->data = ch; CreateBiTree(tree->lchild); CreateBiTree(tree->rchild); sum = InOrderTraverse(tree); printf("=%d\n",sum); } return 0; }
时间: 2024-02-14 18:14:34 浏览: 15
这段代码是一个简单的表达式计算程序,可以接受多行输入,每行输入一个表达式,输出计算结果。程序的核心部分是 InOrderTraverse 函数,该函数采用中序遍历的方式遍历二叉树,当遍历到一个操作符节点时,先递归计算其左子树和右子树的值,然后根据操作符计算结果并返回;当遍历到一个数字节点时,直接将该节点的值返回。在主函数中,程序通过循环读入多行输入,每次输入都新建一个二叉树,计算表达式的值并输出。
相关问题
#include <bits/stdc++.h> using namespace std; typedef string ElemType; typedef struct BitNode { ElemType data; struct BitNode *lchild,*rchild; } BitNode,*BiTree; //char sc[10]= {"+-*/"}; void CreateBiTree(BiTree &t) { string ch; cin >> ch; if(ch[0] == '#') t = NULL; else { t = new BitNode; t->data = ch; CreateBiTree(t->lchild); CreateBiTree(t->rchild); } } void InOrderTraverse(BiTree t) { if(t) { string op = t->data; if(op[0]<'0' || op[0]>'9') cout << '('; InOrderTraverse(t->lchild); cout << t->data ; InOrderTraverse(t->rchild); if(op[0]<'0' || op[0]>'9') cout << ')'; } /***********************************/ } int main() { BiTree tree = new BitNode; string ch; while(cin >> ch) { tree->data = ch; CreateBiTree(tree->lchild); CreateBiTree(tree->rchild); InOrderTraverse(tree); printf("\n"); } return 0; }
这段代码是一个表达式树的建立和遍历程序,可以读入一条表达式,以二叉树的形式建立表达式树,并按照中序遍历的顺序输出中缀表达式。具体实现过程是先读入一个字符串作为根节点的值,然后递归读入左子树和右子树,再按照中序遍历的顺序遍历树并输出表达式。其中,如果遍历到运算符节点,则输出括号,以保证正确的优先级顺序。
转化为java#include <bits/stdc++.h> using namespace std; typedef string ElemType; typedef struct BitNode { ElemType data; struct BitNode *lchild,*rchild; } BitNode,*BiTree; //char sc[10]= {"+-*/"}; void CreateBiTree(BiTree &t) { string ch; cin >> ch; if(ch[0] == '#') t = NULL; else { t = new BitNode; t->data = ch; CreateBiTree(t->lchild); CreateBiTree(t->rchild); } } int InOrderTraverse(BiTree t) { string op = t->data; int a,b; if(op[0]<'0' || op[0]>'9') { cout << '('; a = InOrderTraverse(t->lchild); cout << t->data ; b = InOrderTraverse(t->rchild); cout << ')'; if(op == "+") return a+b; else if(op == "-") return a-b; else if(op == "*") return a*b; else return a/b; } else { //InOrderTraverse(t->lchild); cout << t->data; //InOrderTraverse(t->rchild); int num=0; for(int i=0;i<op.size();i++){ num = num*10 + op[i]-'0'; } return num; } } int main() { BiTree tree = new BitNode; string ch; int sum; while(cin >> ch) { tree->data = ch; CreateBiTree(tree->lchild); CreateBiTree(tree->rchild); sum = InOrderTraverse(tree); printf("=%d\n",sum); } return 0; }
这段代码是一个使用二叉树实现的表达式求值程序,可以支持四则运算和括号。程序中定义了一个二叉树结构体,每个节点存储一个字符,用于表示运算符或操作数。程序通过递归方式构建二叉树,然后通过中序遍历的方式计算表达式的值。如果节点存储的是运算符,则递归计算左右子树的值,然后根据运算符进行计算;如果节点存储的是操作数,则将其转化为整数返回。
具体实现中,程序通过读入字符串的方式构建二叉树,每次读入一个字符,如果是 "#" 则表示节点为空,否则新建一个节点,并递归读入左右子树。在中序遍历的过程中,程序先判断节点存储的是运算符还是操作数,然后根据不同情况进行不同的处理。最后输出表达式的值。
需要注意的是,这段代码可能存在一些错误,比如没有进行输入合法性检查,可能会导致程序崩溃。同时,该算法只支持整数运算,无法处理浮点数。
阅读全文