用二叉树存储计算四则运算表达式

本文介绍了一种使用二叉树来存储和计算四则运算表达式的方法,该方法源于数据结构课程的作业。作者在实现过程中参考了网络资源并加入了个人的理解和改进。
摘要由CSDN通过智能技术生成

这是数据结构课作业,写了很久,代码主要思路参考了网上某个博客(但忘了是哪个博客),不过也融入了我自己的一些思路。

//将字符串类型的四则运算表达式存入二叉树中,支持小数运算和多级括号运算,同时能够将二叉树结构输出到屏幕或者某个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:
    
  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值