11.1.2 表达式树

二叉树是表达式处理的常用工具。

当我们输入一个表达式的时候:a+b*(c-d)-e/f ,那么给二叉树中的每个节点一个字符,这个二叉树可以构成我们所需要的表达式。

那么,我给你一个表达式后,你是如何建立一棵和这个表达式一样的树呢?

问题:
  找到这个表达式中最后运算的符号。

代码:

# include<cstdio>
# include<iostream>
# include<cstring>
using namespace std;
# define MAX 12345
char s[MAX];
int lch[MAX],rch[MAX];//每个结点的左右子结点的编号
char op[MAX];//每个结点所存储的字符
int nc = 0;//结点数
int build( char *s ,int x,int y )
{
    int c1 = -1,c2 = -1;
    int p = 0;
    int u = 0;
    if ( y-x==1 )
    {
        u = ++nc;
        lch[u] = rch[u] = 0;
        op[u] = s[x];
        return u;
    }
    for ( int i = x;i < y;i++ )
    {
        switch(s[i])
        {
            case ‘(‘:p++;break;
            case ‘)‘:p--;break;
            case ‘+‘:case ‘-‘:if (!p) c1 = i;break;
            case ‘*‘:case ‘/‘:if (!p) c2 = i;break;
        }
    }
    if ( c1<0 )
        c1 = c2;
    if ( c1<0 )
        return build(s,x+1,y-1);
    u = ++nc;
    lch[u] = build(s,x,c1);
    rch[u] = build(s,c1+1,y);
    op[u] = s[c1];
    return u;
}
int main(void)
{
    while ( scanf("%s",&s)!=EOF )
    {
        int len = strlen(s);
        int ans = build(s,0,len);
        for ( int i = 0;i < len;i++ )
            cout<<op[i]<<" ";
        cout<<endl;
        printf("%c\n",op[ans]);
    }
    return 0;
}
/*
    a+b*(c-d)-e/f
*/

  

时间: 2024-12-27 06:39:26

11.1.2 表达式树的相关文章

什么是表达式树,它与表达式、委托有什么区别?

序言 首先,需要普及下基础知识: Expression我们称之为:表达式树, 而Func<>或者Action 称之为:匿名委托,Func与Action的区别是Func带返回值(至少一个参数),Action不带返回值(可以没有任何参数). 以上的关键词是在.net 3.5之后出现的,配合Linq中Lambda使用. 当然Expression还可以动态的进行构造它,而不使用Lambda表达式来定义. 什么是表达式树 它是一种数据结构体,用于存储需要计算.运算的一种结构.这种结构可以只是”存储“,而

16.C#初见Lambda表达式及表达式树(九章9.1-9.3)

在说明Lambda相关知识前,我们需要了解Lambda表达式常用于LINQ,那么我们来聊下LINQ. LINQ的基本功能就是创建操作管道,以及这些操作需要的任何状态.这些操作表示了各种关于数据的逻辑:如何过滤.如何排序以及如何将不同的数据源连接在一起,等等.执行委托只是LINQ的众多能力之一.为了富有效率地使用数据库和其他查询引擎,我们需要以一种不同的方式来表示管道中的各个操作.这种不同的方式就可以使用Lambda表达式来表现.下面分别使用委托(使用匿名函数)和Lambda表达式来作出同样的事情

[转] 利用表达式树构建委托改善反射性能

最近搞一个系统时由于在比较关键地方用到反射了,所以要关注了一下反射的性能问题.搜索一下,不难搜到老赵的这篇文章,下面是一些杂乱的笔记.(建议先看老赵的文章) .Net4.0反射性能改善 看老赵的文章,老赵得到的结果是这样的: 1 00:00:00.0125539 (Directly invoke) 2 00:00:04.5349626 (Reflection invoke) 3 00:00:00.0322555 (Dynamic executor) 而我把代码搞下来自己运行得到这样的结果: 1

C#中的Lambda表达式和表达式树

在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在不牺牲可读性的前提下,进一步简化了委托. LINQ的基本功能就是创建操作管道,以及这些操作需要的任何状态.这些操作表示了各种关于数据的逻辑,例如数据筛选,数据排序等等.通常这些操作都是用委托来表示.Lambda表达式是对LINQ数据操作的一种符合语言习惯的表示方式. Lambda表达式不仅可以用来创

表达式树,它与表达式、委托

表达式树,它与表达式.委托有什么区别? 序言 首先,需要普及下基础知识: Expression我们称之为:表达式树, 而Func<>或者Action 称之为:匿名委托,Func与Action的区别是Func带返回值(至少一个参数),Action不带返回值(可以没有任何参数). 以上的关键词是在.net 3.5之后出现的,配合Linq中Lambda使用. 当然Expression还可以动态的进行构造它,而不使用Lambda表达式来定义. 什么是表达式树 它是一种数据结构体,用于存储需要计算.运算

将委托持久化及利用表达式树从持久化库还原委托

在领域事件中,有时为了数据的一致性,需要先将事件持久化,然后在读取数据时还原并执行事件保证数据一致. 持久化委托时,我们需要持久化委托的类型.方法名称和方法参数类型. 如申明一个委托: public delegate void DomainEventHandler(object sender, BaseDomainEventArgs eventArgs); 定义一个事件: public static event DomainEventHandler HelloDomainEvent; 获取事件订

表达式计算--表达式树

目前只能算单位数,可计算括号与加减乘除. 代码如下: 1 #include <cstdio> 2 #include <cstring> 3 4 const int maxn = 1000; 5 int lch[maxn],rch[maxn]; 6 char op[maxn]; 7 int nc = 0,n; 8 char s[1000]; 9 10 int build_tree(char* s, int x , int y) 11 { 12 int c1 = -1,c2 = -1,

表达式树动态拼接lambda

动态拼接lambda表达式树 前言 最近在优化同事写的代码(我们的框架用的是dapperLambda),其中有一个这样很普通的场景——界面上提供了一些查询条件框供用户来进行过滤数据.由于dapperLambda按条件查询时是传入表达式树的参数,这样比如其中查询条件有一个是审核状态,另外五个是模糊查询,那这查询时的表达式树参数就要写两次,这样使得代码看起来有很多是重复的,而且如果查询条件多的情况下,在写那表达式树参数时也容易漏写或错写.所以我在想如果可以动态拼接这表达式树,那这代码就要精简很多了.

[C#] C# 知识回顾 - 表达式树 Expression Trees

C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达式树 调试 简介 表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如方法调用和 x < y 这样的二元运算等. 你可以对表达式树中的代码进行编辑和运算.这样能够动态修改可执行代码.在不同数据库中执行 LINQ 查询以及创建动态查询. 表达式树还能用于动态语言运行时 (DLR) 以提供