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

news2025/1/14 1:14:34

  用二叉树来表示表达式,树的每一个节点包括一个运算符和运算数。代数表达式中只包含+-*/和一位整数且没有错误。按照先括号,再乘除,后加减的规则构造二叉树。如图所示是"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;
	else
		return 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;
	else
		return 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 '>'://栈顶运算符优先级高于ch
				char 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.coloradmin.cn/o/1108497.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法设计zxd】第6章 回溯法

目录 6.1 回溯法的设计技术 &#xff1a; 四皇后问题 回溯法&#xff1a; 算法框架&#xff1a; 思考题&#xff1a; 回溯算法的适用条件 【例6-1】求满足下列不等式的所有整数解&#xff1a; 6.2回溯算法的经典例题 【例6-2】装载问题  问题分析 计算模型  算法设计与描…

selenium多窗口、多iframe切换、alert、3种等待

1、多标签/多窗口之间的切换 场景&#xff1a; 在页面操作过程中有时候点击某个链接会弹出新的窗口&#xff0c;这时就需要切换到新打开的窗口上进行操作。这种情况下&#xff0c;需要识别多标签或窗口的情况。 操作方法&#xff1a; switch_to.window()方法&#xff1a;切换…

【AFL学习笔记(一)】简单的使用AFL进行漏洞挖掘测试

首先声明一点&#xff0c;ALF都是在Linux系统上运行 本文使用的是Ubuntu 20.4 版本进行演示 Step 1 下载afl-2.52b 官网地址afl2.52b 直接下载地址直接下载地址 下载完成之后在Ubuntu系统上进行解压&#xff1a; tar -afl-2.52b.tgzStep 2 创建测试用例 ①&#xff1a;创…

YOLOv5-训练自己的VOC格式数据集(VOC、自建数据集)

YOLOv5&#xff1a;训练自己的 VOC 格式数据集 1. 自定义数据集 1.1 环境安装 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple注意&#xff1a; 安装 lxmlPillow 版本要低于 10.0.0&#xff0c;解释链接: module ‘PIL.Image’ has no attri…

Amazon图片下载器:利用Scrapy库完成图像下载任务

概述 本文介绍了如何使用Python的Scrapy库编写一个简单的爬虫程序&#xff0c;实现从Amazon网站下载商品图片的功能。Scrapy是一个强大的爬虫框架&#xff0c;提供了许多方便的特性&#xff0c;如选择器、管道、中间件、代理等。本文将重点介绍如何使用Scrapy的图片管道和代理…

vue 使用crypto.js解密后,用JSON.parse转义报错非空白格解决办法

问题&#xff1a; 用JSON.parse转义crypto解密后的json字符串会发生错误。如图&#xff1a; 原因&#xff1a; 那是因为crypto自己加了一些未可见的字符&#xff0c;所以用正常的JSON.parse(xxxx)会报错。 解决办法&#xff1a; JSON.parse(xxxx.replace(/[\u0000-\u001F\u…

TX Text Control.NET 32.0 For WPF

TX Text Control 支持VISUAL STUDIO 2022、.NET 5 和 .NET 6 支持 .NET WPF 应用程序的文档处理 将文档编辑、创建和 PDF 生成添加到您的 WPF 应用程序中。 视窗用户界面 功能齐全的文档编辑器 TX Text Control 是一款完全可编程的丰富编辑控件&#xff0c;它在专为 Visual Stu…

C++入门篇---(完)内联函数,auto,for,nullptr

往期回顾: ⭐C入门篇---(1)命名空间与缺省参数 ⭐C入门篇---(2)函数重载 ⭐C入门篇---(3)引用 目录 1.内联函数 1.1概念 1.2特性 2.aotu关键字 2.1类型别名 2.2auto简介 2.3auto使用细节 2.4auto不能推导的场景 3.范围for 3.1语法 3.2使用条件 4.指针空值(nullptr) …

C#中List、Dictionary、HashSet用法以及区别

前言 在C#编程中&#xff0c;List、Dictionary和HashSet是常用的集合类型,它们都有自己的特点和适用场景。本篇博客将介绍它们的用法、区别及常见操作。深入了解这些集合类型&#xff0c;能够帮助我们更好地组织和处理数据。 1. List: List是一个有序可重复集合&#xff0c;可…

【AI视野·今日CV 计算机视觉论文速览 第269期】Tue, 17 Oct 2023

AI视野今日CS.CV 计算机视觉论文速览 Tue, 17 Oct 2023 Totally 158 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers HairCLIPv2: Unifying Hair Editing via Proxy Feature Blending Authors Tianyi Wei, Dongdong Chen, Wenbo Zhou, Jing …

【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

![请 https://cloud.tencent.com/act/cps/redirect?redirect2446&cps_key2e531299bf7e92946df4c3162a81b552&fromconsole

【故障诊断】用于轴承故障诊断的候选故障频率优化克改进包络频谱研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

网络编程 - TCP协议

一&#xff0c;TCP基本概念 TCP的特性&#xff1a; TCP是有连接的&#xff1a;TCP想要通信&#xff0c;就需要先建立连接&#xff0c;之后才能通信 TCP是可靠传输&#xff1a;网络上进行通信&#xff0c;A给B发消息&#xff0c;这个消息是不可能做到100%送达的&#xff0c;所以…

Qt配置OpenCV(保姆级教程)

Qt配置OpenCV Qt下载CMake安装OpenCV安装Qt配置OpenCV Qt下载 Qt点击下载 具体的安装过程就不在讲了&#xff0c;根据自己的需求进行安装。 CMake安装 CMake点击下载 直接跟着提示进行安装就行。 OpenCV安装 OpenCV点击下载 提示&#xff1a;这里建议安装我指定的版本&#x…

关于python环境下的语音转文本,whisper或funASR

因为前阵子&#xff0c;有需求要将语音转为文本再进行下一步操作。感觉这个技术也不算是什么新需求&#xff0c;但是一搜&#xff0c;都是大厂的api&#xff0c;或者是什么什么软件&#xff0c;由于想要免费的&#xff0c;同时也要嵌入在代码中&#xff0c;所以这些都不能用。、…

半导体可靠性测试方法都有哪些?

半导体测试是半导体设备中的一种技术&#xff0c;其中半导体组件(芯片、模块等)在组装到系统就会出现故障。在特定电路的监控下&#xff0c;部件被迫经历一定的半导体试验条件&#xff0c;并分析部件的负载能力等性能。这种半导体测试有助于确保系统中使用的组件导体器件&#…

JDK命令行工具

1 jps: jps命令可以方便的查看进程id,启动类,传入参数, jvm参数 jps命令类似于linux 下的ps,但是只列出java的进程. 直接运行jps不加参数,会列出java程序的进场ID,及main函数名称 C:\Users\shj>jps 42340 Jps 41064 42040 JucApplication 37804 Launcher可以看到,目前有4个…

Confluence 用户管理

1. 创建用户 功能入口&#xff1a; Confluence→管理→用户管理→添加用户 功能说明&#xff1a; 填写必要信息&#xff0c;点击“添加”按钮&#xff0c;即可完成用户创建 用户名&#xff1a;英文名称&#xff0c;真实用户统一采用邮箱前缀&#xff1b;全名&#xff1a;中…

python换源,解决pip安装第三方库时无法下载和连接超时等问题

使用pip安装包是用python编码最基础并且必不可少的基础&#xff0c;新手入门时常常会跟着网上的教程说换源&#xff0c;但还会出现意料之外的问题&#xff0c;比如&#xff1a; 1.换源之后还是连接超时 2.在pycharm的python interpreter中安装包显示 Error updating package …

多模态及图像安全的探索与思考

前言 第六届中国模式识别与计算机视觉大会&#xff08;The 6th Chinese Conference on Pattern Recognition and Computer Vision, PRCV 2023&#xff09;已于近期在厦门成功举办。通过参加本次会议&#xff0c;使我有机会接触到许多来自国内外的模式识别和计算机视觉领域的研究…