这是数据结构课作业,写了很久,代码主要思路参考了网上某个博客(但忘了是哪个博客),不过也融入了我自己的一些思路。
//将字符串类型的四则运算表达式存入二叉树中,支持小数运算和多级括号运算,同时能够将二叉树结构输出到屏幕或者某个txt文件(一棵横着的二叉树),目前一大缺陷是不能检查输入是否有误,
/*
测试样例:1+2 1*9/3 764+743/90*45+56-87 8*(9+2*(3+(4*(5+6*(7+8))))) [(7.1-5.6)*0.9-1.15]/2.5 [(7-5)*0.9-1]/2 [(7-5)*9-1]/2
{[4+3*(5+6)]*[2+8*(1+2)]+5}/4 {[4+3*(5+6)]*[2+8*(1+2)]}/4
a+g a+g/c
*/
#include<iostream>//继承自ostream
#include<fstream>
#include<string>
using namespace std;
//将字符串转换成double类型数字,支持小数
double strToDouble(string& s,int start,int end)
{
double num = 0.0;
int dot = 0;
for (int i = start; i <= end; ++i)
{
if (s[i] == '.')
dot = i;
else
num = num * 10 + s[i] - '0';
}
if (dot != 0)
return num / pow(10, end - start - dot);
return num;
}
//表达式基类
class Expression
{
public:
Expression() { leftChild = rightChild = nullptr; }
Expression(Expression* theLeftChild, Expression* theRightChild) {
leftChild = theLeftChild;
rightChild = theRightChild;
}
public:
Expression* leftChild, *rightChild;//运算符节点肯定有两个节点:但是为了方便放在基类中
};
//常数类
class Constant :public Expression
{
friend class Operation;
friend double getResult(Expression*);//返回二叉树运算结构
public:
Constant(string value) { this->value = value; }//O(1)
private:
string value;//既能存数字又能存变量
};
//运算符类
class Operation :public Expression
{
friend void output(Operation,ostream&);//输出树的结构
friend double getResult(Expression*);//返回二叉树运算结构
public: