利用递归和二叉树实现多位数整数的计算

2023-05-16

 题目:


 功能设计:

  1. 读取用户输入的表达式创建表达式树功能
  2. 遍历表达式树进行表达式求值功能
  3. 输出表达式计算结果功能

功能实现: 

1. 

2.

3.


运行结果: 

用户输入1,输入要计算的表达式并以#结尾,系统便会给出计算结果。

用户输入2,退出程序。


 完整代码展示:

#include<iostream>
using namespace std;
//二叉树结构
typedef struct BiTNode
{
    char data;
    int   num;
    struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;

//栈结构
typedef struct StackNode
{
    BiTNode* root;
    char   op;
    struct StackNode* next;
} StackNode, * LinkStack;

int InitStack(LinkStack& S)  //构造空栈
{
    S = NULL;
    return 1;
}

int Push_root(LinkStack& S, BiTree e)      //根节点入栈
{
    LinkStack p = new StackNode;
    if (!p)
        exit(OVERFLOW);
    p->root = e;
    p->next = S;
    S = p;
    return 1;
}

void Push_op(LinkStack& S, char e)      //操作符入栈

{
    LinkStack p = new StackNode;
    if (!p)
        exit(OVERFLOW);
    p->op = e;
    p->next = S;
    S = p;
}

int Pop_root(LinkStack& S, BiTree& e)  //根节点出栈
{
    if (S == NULL)
    {
        cout << "输入格式错误,请输入整数表达式";
        return 0;
    }
    e = S->root;
    LinkStack p = S;
    S = S->next;
    delete p;
    return 1;
}

int Pop_op(LinkStack& S, char& e)  //操作符出栈
{
    if (S == NULL)
    {
        cout << "输入格式错误,请输入整数表达式";
        return 0;
    }
    e = S->op;
    LinkStack p = S;
    S = S->next;
    delete p;
    return 1;
}

char  GetTop_op(LinkStack S)    //返回栈顶元素
{
    if (S != NULL)     //栈非空
        return S->op;
}

char Precede(char t1, char t2)  //判断两个运算符的优先关系
{
    char f{};
    switch (t2)
    {
    case '+':
        if ((t1 == '(') || (t1 == '#'))
            f = '<';
        else f = '>';
        break;
    case '-':
        if ((t1 == '(') || (t1 == '#'))
            f = '<';
        else f = '>';
        break;
    case '*':
        if ((t1 == '*') || (t1 == '/') || (t1 == ')'))
            f = '>';
        else f = '<';
        break;
    case '/':
        if ((t1 == '*') || (t1 == '/') || (t1 == ')'))
            f = '>';
        else f = '<';
        break;
    case '(':
        f = '<';
        break;
    case ')':
        if ((t1 == '('))
            f = '=';
        else f = '>';
        break;
    case '#':
        if (t1 == '#')
            f = '=';
        else f = '>';
        break;
    }
    return f;
}

int In(char i)  //判断读取到的字符是否是操作符
{
    switch (i)
    {
    case '+': case '-':  case '*':  case '/':
    case '(':   case ')':  case '#':  return 1;
        break;
    default:  return 0;
    }
}

int  GetValue(int a, char theta, int b)
{
    switch (theta)
    {
    case '+': return a + b;
    case '-': return a - b;
    case '*': return a * b;
    case '/': return a / b;
    }
}

void CreateExpressTree_op(BiTree& T, BiTree a, BiTree b, char theta)
//创建一棵树,左孩子是a,右孩子是b,数据域是theta用来储存运算符
{
    BiTree L = new BiTNode;
    L->data = theta;
    L->lchild = a;
    L->rchild = b;
    T = L;
}

void CreateExpressTree_num(BiTree& T, BiTree a, BiTree b, int theta)
//创建一棵树,左孩子是a,右孩子是b,数据域是theta用来储存数字
{
    BiTree L = new BiTNode;
    L->num = theta;
    L->lchild = a;
    L->rchild = b;
    T = L;
}

void CreateBiTree(BiTree& T)  //读取输入表达式创建二叉树
{
    LinkStack EXPT;
    LinkStack OPTR;
    InitStack(EXPT);
    InitStack(OPTR);
    Push_op(OPTR, '#');
    BiTree a = NULL, b = NULL, c, d;
    char ch, theta, f;
    int m = 0;
    cin >> ch;
    while ((ch != '#') || (GetTop_op(OPTR)) != '#')
    {
        if (!In(ch))   //判断读取到的字符是不是运算符
        {             //当字符是数字时
            while (!In(ch))
            {
                //实现多位整数
                ch = ch - '0';
                m = m * 10 + ch;
                ch = getchar();
            }
            if (m != 0)
            {
                CreateExpressTree_num(T, a, b, m); //以m为节点创建一棵只有根节点的二叉树
                Push_root(EXPT, T);                //将二叉树根节点T进EXPT栈
                m = 0;
            }
        }
        else   //读取到的字符是四则运算符
        {
            switch (Precede(GetTop_op(OPTR), ch))    //判断优先级
            {
            case '<': Push_op(OPTR, ch);             //当前字符压入OPTR栈,读取下一字符
                ch = getchar();
                break;
            case '>': Pop_op(OPTR, theta);           //弹出OPTR栈顶的运算符
                Pop_root(EXPT, c);                   //弹出EXPT栈顶的两个操作数
                Pop_root(EXPT, d);
                CreateExpressTree_op(T, d, c, theta);//以theta为根,d为左子树,d为右子树,创建一棵二叉树
                Push_root(EXPT, T);                  //使二叉树根节点进EXPT栈
                break;

            case '=':
                Pop_op(OPTR, f);
                ch = getchar();
                break;
            }
        }
    }
}


int EvaluateExPTree(BiTree T) //遍历表达式数进行表达式求值

{
    int lvalue = 0, rvalue = 0;//初始值为0
    if (T->lchild == NULL && T->rchild == NULL)
        //如果节点为操作数,则返回该结点的数值
    {
        return T->num;
    }
    else
    {
        lvalue = EvaluateExPTree(T->lchild);
        //递归计算左子树的值
        rvalue = EvaluateExPTree(T->rchild);
        //递归计算右子树的值
        return GetValue(lvalue, T->data, rvalue);
        //根据当前节点运算符的类型进行相应运算
    }
}

int main()
{
    while (true) {
        cout << "******************************************" << endl;
        cout << "**                                      **" << endl;
        cout << "**-----------欢迎来到表达式计算*--------**" << endl;
        cout << "**                                      **" << endl;
        cout << "**   1.输入整数表达式(以#结尾):      **" << endl;
        cout << "**                                      **" << endl;
        cout << "**   2.退出                             **" << endl;
        cout << "**                                      **" << endl;
        cout << "******************************************" << endl;
        int op;
        cout << "请输入你的选择:";
        cin >> op;
        BiTree T;
        switch (op) {
        case 1:
            cout << "请输入整数表达式(以#结尾):" << endl;
            CreateBiTree(T);   //创建表达式二叉树函数
            cout << "计算结果为:" << EvaluateExPTree(T) << endl;
            break;
        case 2:
            exit(0);
            break;
        }
    }
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用递归和二叉树实现多位数整数的计算 的相关文章

  • Ubuntu基础——网络配置+配置apt源(手把手教程)

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 安装环境 xff1a Ubuntu22 04 一 xff1b 切换管理员模式 首先我们来到命令行输入su xff08 请注意命令的空格 x
  • 不建议单片机的IO口直接驱动直流电机

    实验目的 想通过单片机的PF9引脚pwm输出来调节直流马达速度 硬件连接 xff1a 直流马达的两个引脚一端接PF9 另一端接GND 实验现象 xff1a 直流电机不转 xff0c 但是用万用表测量PF9和地之间有电压 但是连上电机后 xf
  • Ubuntu系统进行复制粘贴文件显示没有权限的解决办法

    Ctrl 43 alt 43 T打开终端 输入命令sudo nautilus 然后就可以打开一个不需要管理员权限的界面 xff0c 可以直接复制粘贴 亲测有效 xff01 xff01 借鉴于博客 xff1a https blog csdn
  • Windows下Python安装twint的方法

    1 安装git xff0c 如果不安git工具 xff0c 用pip install twint安装出来的twint是运行不了的 Git Downloading Package git scm com 64位的链接https github
  • 初学Python,if __name__ == ‘__main__‘:

    if name 61 61 39 main 39 若是在当前文件 xff0c name 是 main 若是导入的文件 xff0c name 是模块名 这句话的意思就是 xff0c 当模块被直接运行时 xff0c 以下代码块将被运行 xff0
  • 初学Python,urllib实现翻译

    import urllib request import urllib parse import json import time url 61 34 https fanyi youdao com translate smartresult
  • PVE踩坑实录2设置无线网卡

    wifi设置 1 在https www wireshark org tools wpa psk html上面算出自己的wap psk 2 修改网卡设置 vi etc network interfaces auto wlp2s0 iface
  • A10-7860K试装DSM

    家里旧电脑一台 xff0c A10 7860K xff0c 想发挥下余热 xff0c 然后就是一周的尝试 终于暂时可以用如下配置启动 xff0c 无错误 PVE7 3 1 处理器host xff0c SeaBIOS xff0c 机型i440
  • 记一起和前端没什么卵关系的OPTION 405问题

    记一起和前端没什么卵关系的后端405问题 问题的关键点在于本来是POST请求 xff0c 会变成OPTION请求 xff0c 并且提示405报错 xff0c 会类似跨域 并且只有某些手机机型才会 xff08 如Oppo系列 xff09 其实
  • 单点登录 Oauth2认证 详解

    1 单点登录的特点是 xff1a 1 认证系统为独立的系统 2 各子系统通过Http或其它协议与认证系统通信 xff0c 完成用户认证 3 用户身份信息存储在Redis集群 Java中有很多用户认证的框架都可以实现单点登录 xff1a 1
  • 【JAVA】-JAVA简介

    目录 一 JAVA的简介 发展概述 语言的优势 二 JAVA的特性 一 JAVA的简介 发展概述 1 1 JAVA语言发展简史 Java 语言源于 1991 年 4 月 xff0c Sun 公司 James Gosling博士 领导的绿色计
  • SpringBoot整合mybatis-plus实现分页查询(建议收藏)

    一 前言 最近学习了SpringBoot分页查询的两种写法 xff0c 一种是手动实现 xff0c 另一种是使用框架实现 现在我将具体的实现流程分享一下 二 手动实现分页查询 先复习一下 xff0c SQL中的limit关键字 xff0c
  • MySQL 数据库 分组查询

    分组查询 xff1a 包括单列分组查询和多列分组查询 group by 单列分组查询 示例 xff1a 1 根据科目分组 xff0c 查询每个科目的平均分 2 根据班级分组 xff0c 查询每个班级成绩总数 3 根据班级分组 xff0c 查
  • JAVA http请求工具类

    原文 xff1a JAVA http请求工具类 月半花开的博客 CSDN博客 目录 1 第一种http requst 1 xff09 maven引入 2 xff09 Get请求请求示例 3 xff09 post请求请求示例 2 第二种hut
  • Weather API 天气应用 API调用分享

    Weather API 分享 链接 xff1a https openweathermap org api 注册默认是One Call API 3 0 适合学生项目练手 提供以下天气数据 xff1a 当前天气每小时 分钟预报48小时每小时预报
  • pip安装python包到指定路径

    1 2 我们可以先进入创建好的虚拟环境的site packages 我还没有尝试 xff1a
  • Kubernetes1.26.0部署(Ubuntu/CentOS)

    文章目录 前言准备工作准备5台虚拟机初始化操作Centos配置yum源配置免密 修改hostname 关闭防火墙 selinux 关闭swap分区 方便后面进行其它操作 下载软件包并批量安装配置时间同步配置打开文件描述符添加ipvs模块和内
  • 真正免费的天气API,无需注册申请key

    文章目录 1 中华万年历的天气API 2 讯飞语音识别内置的墨迹天气API 3 乐享天气APP 4 蚂蚁数据天气查询API接口 无聊整理的真正免费的天气API xff0c 无需注册申请key等 xff0c 当然部分数据解析需要自己理解下 x
  • rollup 打包报错

    RollupError Node tried to load your configuration file as CommonJS even though it is likely an ES module To resolve this
  • 视频4K技术的解读

    前几年4K技术就已经有人提及 xff0c 今年更是成了一个非常热门的词汇 xff0c 而且4K技术已经普遍应用于各类终端 xff0c 如电视机 机顶盒 手机等 那么如何来理解4K这个东东呢 xff1f 今天博主就谈谈自己对4K技术的认识 博

随机推荐