二叉树实现表达式求值(C++)

  用二叉树来表示表达式,树的每一个节点包括一个运算符和运算数。代数表达式中只包含+-*/和一位整数且没有错误。按照先括号,再乘除,后加减的规则构造二叉树。如图所示是"1+(2+3)*2-4/5"代数表达式对应二叉树,用对应的二叉树计算表达式的值。

输入格式:

输入一行表达式字符串,以#结束,括号内只能有一个运算符。

输出格式:

输出表达式的计算结果. 

 

https://images.ptausercontent.com/364

#include<iostream>
#include<stack>
using namespace std;
typedef struct node
{char data;node* lchild, * rchild;
}*tree;
stack<tree> expt;
int judge(char ch)//判断是运算符
{if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')' || ch == '#')return 1;elsereturn 0;
}
int jisuan(int n1, int n2, char ch)//计算
{if (ch == '+')return n1 + n2;else if (ch == '-')return n1 - n2;else if (ch == '*')return n1 * n2;elsereturn n1 / n2;
}
char Precede(char ch1, char ch2)//判断优先级,ch1栈顶元素
{char flag = '>';if (ch1 == '+'){switch (ch2){case '+':case '-':case '#':case ')':flag = '>';break;case '*':case '/':case '(':flag = '<';break;}}else if (ch1 == '-'){switch (ch2){case '+':case '-':case '#':flag = '>';break;case '*':case '/':case '(':case ')':flag = '<';break;}}else if (ch1 == '*'){switch (ch2){case '+':case '-':case '#':case '*':case '/':case ')':flag = '>';break;case '(':flag = '<';break;}}else if (ch1 == '/'){switch (ch2){case '+':case '-':case '#':case '*':case '/':case ')':flag = '>';break;case '(':flag = '<';break;}}else if (ch1 == '('){switch (ch2){case '+':case '-':case '*':case '/':case '(':flag = '<';break;case ')':flag = '=';break;}}else if (ch1 == ')'){switch (ch2){case '+':case '-':case '*':case '/':case ')':case '#':flag = '>';break;}}else if (ch1 == '#'){switch (ch2){case '+':case '-':case '*':case '/':case '(':flag = '<';break;case '#':flag = '=';break;}}return flag;
}
void create(tree& t, tree a, tree b, char ch)//构建子树
{t = new node;t->data = ch;t->lchild = a, t->rchild = b;
}
void Createtree()
{char ch;stack<char> optr;//运算符optr.push('#');cin >> ch;//输入while (ch != '#' || optr.top() != '#'){if (!judge(ch))//不是运算符{tree t;t = new node;create(t, NULL, NULL, ch);//构建子树,操作数的左右子树为空expt.push(t);//压入子树栈cin >> ch;}else{switch (Precede(optr.top(), ch)){case '<'://ch的优先级高于栈顶运算符optr.push(ch);//ch压入运算符栈cin >> ch;break;case '>'://栈顶运算符优先级高于chchar yun;yun = optr.top();//取栈顶运算符optr.pop();tree a, b;a = new node, b = new node;b = expt.top();//右子树expt.pop();a = expt.top();//左子树expt.pop();tree t;t = new node;create(t, a, b, yun);//以栈顶运算符为根,构建子树expt.push(t);break;case '=':optr.pop();cin >> ch;break;}}}
}
int valuetree(tree t)//树计算
{int lchild = 0, rchild = 0;if (t->lchild == NULL && t->rchild == NULL)return t->data - '0';else{lchild = valuetree(t->lchild);rchild = valuetree(t->rchild);return jisuan(lchild, rchild, t->data);}
}
void printtree(tree t)//中序遍历
{if (t){printtree(t->lchild);cout << t->data;printtree(t->rchild);}
}
int main()
{Createtree();tree t = expt.top();//栈底即为树//printtree(t);int a = valuetree(t);cout << a;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/139894.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GEO生信数据挖掘(九)WGCNA分析

第六节&#xff0c;我们使用结核病基因数据&#xff0c;做了一个数据预处理的实操案例。例子中结核类型&#xff0c;包括结核&#xff0c;潜隐进展&#xff0c;对照和潜隐&#xff0c;四个类别。第七节延续上个数据&#xff0c;进行了差异分析。 第八节对差异基因进行富集分析。…

nfs+rpcbind实现服务器之间的文件共享

NFS简介 NFS服务及Network File System&#xff0c;用于在网络上共享存储&#xff0c;分为2,3,4三个版本&#xff0c;最新为4.1版本。NFS基于RPC协议&#xff0c;RPC为Remote Procedure Call的简写。 应用场景&#xff1a;用于A,B,C三台机器上需要保证被访问到的文件是一样…

10.17课上(七段显示器,递归异或与电路)

异或的递归与数电实现 用二选一选择器实现异或函数 在异或当中&#xff0c;如果有一项为0&#xff0c;就可以把那一项消掉&#xff1b;如果有一项为1&#xff0c;就是把剩下的所有项运算完的结果取反 &#xff08;由此在算法当中可以采用递归解决&#xff09; 当w1为0时&…

Electron webview 内网页 与 preload、 渲染进程、主进程的常规通信 以及企业级开发终极简化通信方式汇总

Electron 嵌入的页面中注入的是 preload.js 通过在标签中给 prelaod赋值&#xff0c;这里提到了 file://前缀&#xff0c;以及静态目录 static 怎么获取 实际代码&#xff0c;其中__static就是我们存放静态文件的地方&#xff0c;这个 static 是 electron 源代码根目录下的文件…

Nested loop(PostgreSQL 14 Internals翻译版)

连接类型和方法 连接是SQL语言的一个关键特性;它们是其力量和灵活性的基础。行集(要么直接从表中检索&#xff0c;要么作为某些其他操作的结果接收)总是成对连接。 有几种类型的连接&#xff1a; 内连接。 内连接(指定为“INNER JOIN”或简称为“JOIN”)由满足特定连接条件的…

文心一言 4.0 ERNIE-Bot 4.0 :ERNIE-Bot 4.0 大模型深度测试体验报告

本心、输入输出、结果 文章目录 文心一言 4.0 ERNIE-Bot 4.0 &#xff1a;ERNIE-Bot 4.0 大模型深度测试体验报告前言相关跳转文心一言 4.0 ERNIE-Bot 4.0 接口简介Bash 请求示例代码Windows 模式使用 Python 请求如果直接使用官方提供的代码文心一言 4.0 ERNIE-Bot 4.0 API 在…

首发AI原生应用开发平台——千帆AI原生应用开发工作台,加速企业AI应用落地

为了满足企业对于敏捷和高效地进行AI原生应用开发与运维的需求&#xff0c;并降低相关开发的门槛&#xff0c;百度智能云最新发布了“千帆AI原生应用开发工作台”。该工作台将开发大型模型应用程序的常见模式、工具和流程进行了整合&#xff0c;使得开发者可以聚焦于自身业务&a…

【excel】列转行

列转行 工作中有一些数据是列表&#xff0c;现在需要转行 选表格内容&#xff1a;在excel表格中选中表格数据区域。点击复制&#xff1a;在选中表格区域处右击点击复制。点击选择性粘贴&#xff1a;在表格中鼠标右击点击选择性粘贴。勾选转置&#xff1a;在选择性粘勾选转置选…

【TES720D-KIT】青翼自研基于复旦微FMQL20S400全国产化ARM开发套件(核心板+底板)

TES720D-KIT是专门针对我司TES720D&#xff08;基于复旦微FMQL20S400的全国产化ARM核心板&#xff09;的一套开发套件&#xff0c;它包含1个TES720D核心板&#xff0c;加上一个TES720D-EXT扩展底板。 FMQL20S400是复旦微电子研制的全可编程融合芯片&#xff0c;在单芯片内集成…

flutter app开发环境搭建

Flutter是一个跨终端、多设备的应用界面开发工具&#xff0c;其支持web端、移动端、桌面端以及嵌入式不同应用场景的应用开发&#xff0c;其使用dart语言作为开发语言&#xff0c;本文主要描述Flutter开发环境搭建。 如上所示&#xff0c;从Flutter官方网站下载最新版本的Flutt…

竞赛选题 深度学习YOLO安检管制物品识别与检测 - python opencv

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络4 Yolov55 模型训练6 实现效果7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLO安检管制误判识别与检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&…

森海塞尔EW-DP SKP直插式发射机:真正的无失真录制

韦德马克&#xff0c;2023年9月15日 – 10月底&#xff0c;EW-DP系列将再添新品——EW-DP SKP直插式发射机&#xff0c;面向摄像师、广播电视公司和电影制作人。板载32位浮点录制&#xff0c;结合该系列领先的134 dB发射机动态范围&#xff0c;让音频失真不复存在。无论要在现场…