C++ — 后缀表达式转表达式树
2018-07-21 16:57:26 update
建立表达式树的基本思路:方法类似由下而上建立堆的思想,所以时间复杂度为O(n),这样算法就会变得很简单,只用考虑处理需要入栈的节点和栈中的节点即可。。。
code:
#include "stdafx.h"
#include <iostream>
#include <stack>
#include <string> class expr_tree
{
struct base_node
{
char c;
base_node * lc, *rc;
base_node() {}
base_node(char c)
: c(c)
, lc(nullptr)
, rc(nullptr)
{
}
} * root;
protected:
void parse_expr(std::string str);
void proorder_print(base_node * n);
void inorder_print(base_node * n);
void postorder_print(base_node * n);
void destory(base_node * & n);
double eval(base_node * n); public:
void show(); expr_tree(std::string str)
{
parse_expr(str);
}
~expr_tree()
{
destory(this->root);
}
}; void expr_tree::parse_expr(std::string str)
{
std::stack<base_node *> stack_node;
for (auto c : str)
{
base_node * node = new base_node(c);
if (c >= '0' && c <= '9' || c >= 'a' && c <= 'z')
stack_node.push(node);
else if (c == '+' || c == '-' || c == '*' || c == '/')
{
if (!stack_node.empty())
{
node->rc = stack_node.top();
stack_node.pop();
}
if (!stack_node.empty())
{
node->lc = stack_node.top();
stack_node.pop();
}
stack_node.push(node);
}
else
{
std::cout << "表达式有误!" << std::endl;
exit(1);
}
}
root = stack_node.top();
while (!stack_node.empty())
stack_node.pop();
} void expr_tree::proorder_print(base_node * n)
{
if (n)
{
std::cout << n->c;
proorder_print(n->lc);
proorder_print(n->rc);
}
} void expr_tree::inorder_print(base_node * n)
{
if (n)
{
if (n->c >= '0' && n->c <= '9')
std::cout << n->c;
else
{
std::cout << '(';
inorder_print(n->lc);
std::cout << ' ' << n->c << ' ';
inorder_print(n->rc);
std::cout << ')';
}
}
} void expr_tree::postorder_print(base_node * n)
{
if (n)
{
postorder_print(n->lc);
postorder_print(n->rc);
std::cout << n->c;
}
} void expr_tree::show()
{
std::cout << "前缀表达式:" << std::endl;
proorder_print(this->root);
std::cout << std::endl;
std::cout << "中缀表达式:" << std::endl;
inorder_print(this->root);
std::cout << " = " << eval(this->root) << std::endl;
std::cout << "后缀表达式:" << std::endl;
postorder_print(this->root);
std::cout << std::endl;
} double expr_tree::eval(base_node * n)
{
switch (n->c)
{
case '+': return eval(n->lc) + eval(n->rc);
case '-': return eval(n->lc) - eval(n->rc);
case '*': return eval(n->lc) * eval(n->rc);
case '/': return eval(n->lc) / eval(n->rc);
default: return n->c - '0';
}
} void expr_tree::destory(base_node * & root)
{
if (root != nullptr)
{
destory(root->lc);
destory(root->rc);
delete root;
}
} int main()
{
std::string str = "23+456+**"; expr_tree res(str);
res.show();
return 0;
}
C++ — 后缀表达式转表达式树的更多相关文章
- [.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门
[.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门 本节导读: 认识表达式树(Expression Tree),学习使用Lambda创建表达式树,解析表达式树. 学习 ...
- [.net 面向对象程序设计进阶] (7) Lamda表达式(三) 表达式树高级应用
[.net 面向对象程序设计进阶] (7) Lamda表达式(三) 表达式树高级应用 本节导读:讨论了表达式树的定义和解析之后,我们知道了表达式树就是并非可执行代码,而是将表达式对象化后的数据结构.是 ...
- C#中的Lambda表达式和表达式树
在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在 ...
- 16.C#初见Lambda表达式及表达式树(九章9.1-9.3)
在说明Lambda相关知识前,我们需要了解Lambda表达式常用于LINQ,那么我们来聊下LINQ. LINQ的基本功能就是创建操作管道,以及这些操作需要的任何状态.这些操作表示了各种关于数据的逻辑: ...
- Lambda表达式和表达式树
在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在 ...
- C#3.0 Lamdba表达式与表达式树
Lamdba表达式与表达式树 Lamdba表达式 C#2.0中的匿名方法使得创建委托变得简单起来,甚至想不到还有什么方式可以更加的简化,而C#3.0中的lamdba则给了我们答案. lamdba的行为 ...
- C#复习笔记(4)--C#3:革新写代码的方式(Lambda表达式和表达式树)
Lambda表达式和表达式树 先放一张委托转换的进化图 看一看到lambda简化了委托的使用. lambda可以隐式的转换成委托或者表达式树.转换成委托的话如下面的代码: Func<string ...
- 深入学习C#匿名函数、委托、Lambda表达式、表达式树类型——Expression tree types
匿名函数 匿名函数(Anonymous Function)是表示“内联”方法定义的表达式.匿名函数本身及其内部没有值或者类型,但是可以转换为兼容的委托或者表达式树类型(了解详情).匿名函数转换的计算取 ...
- 无法将具有语句体的lambda表达式转换为表达式树
很早就碰到了这个问题,当时也没有深入的研究,趁着空闲,遂把这个问题研究清楚. (一)普通案例 下面从一个普通的案例入手,下面准备两个List集合,都是放在内存里面的(需要模拟到远端执行的时候,我们是通 ...
- 【BZOJ4556】字符串(后缀数组,主席树)
[BZOJ4556]字符串(后缀数组,主席树) 题面 BZOJ 题解 注意看题: 要求的是\([a,b]\)的子串和[c,d]的\(lcp\)的最大值 先来一下暴力吧 求出\(SA\)之后 暴力枚举\ ...
随机推荐
- ios中ipa包的发布平台
目前我所知的平台 1.蒲公英 目前 限制 金融类app 区块链类app的上传,小编的号因此刚被封号,而且交涉无果,不给解封,只有提交工单,包号注销了,再注册一个[建议看一下使用规则] 小编认为, ...
- centOs安装出现No package git available的解决办法
来源地址 [http://chinacheng.iteye.com/blog/1825538 ] centos安装git 下载源代码安装后,git clone出现“fatal unable to fi ...
- oracle 多表查询,请教个问题
首先,是有一个合同表,对应数据库表 lg_bill_of_lading_detail 简称 bold 有一个用户表 EMT_USER 简称 e 合同审批 后,合同表里 会有一个审核人AUDI ...
- excel表格 筛选 通过mysql语句
1.整理excel表格的数据 类似的 前面有其他符号的 都可以处理. 注意下一步是2个操纵:分别设置左右: 结果: 2.在复制粘贴到excel的时候,会有一些数字被设置成了科学计数法, 例如复制到ex ...
- 【笔记7-部署发布】从0开始 独立完成企业级Java电商网站开发(服务端)
阿里云服务 购买 连接 购买域名 域名备案 域名解析 源配置步骤 资源地址 http://learning.happymmall.com/ 配置阿里云的yum源 1.备份 mv /etc/yum.re ...
- Python爬虫:urllib库的基本使用
请求网址获取网页代码 import urllib.request url = "http://www.baidu.com" response = urllib.request.ur ...
- springboot2.x整合redis
pom文件 <!--springboot中的redis依赖--> <dependency> <groupId>org.springframework.boot< ...
- Snuke's Coloring 2-1
There is a rectangle in the xy-plane, with its lower left corner at (0,0) and its upper right corner ...
- 关于OSPF LSA不稳定!
Issue 1 Solution It is important that you understand the error message during attempts to troublesho ...
- java里自定义分页查询的尝试
public String list(){ try { LoginUser loginUser = getLoginUser();//获取当前登录用户 if(curpage<=0){ curpa ...