zoukankan      html  css  js  c++  java
  • 表达式树及求值

    #include <bits/stdc++.h>
    using namespace std;
    //从0开始
    //另一种方法构建表达式树,并通过表达式树进行表达式求值
    //约定表达式都是合法的,且在一行内输入,并没有空格
    //约定运算符有 + - * /(整除) ( ) 
    //约定操作数都是一位正整数,没有负号
    char s[100],ops[100];//ops是树的节点内容
    int len=-1,lc[100],rc[100];
    //对应节点的左右子树,不想用结构体,伪指针
    
    //思路:运算符优先级最低的点是根
    //数值点一定是叶子,单独创建
    //最后一个允许的运算符:跳过所有的括号内的运算符,找括号外的 最后一个+-*/,
    //如果有-+,就以+-为准,否则以*/为准
    int build(int x,int y){
        // [x,y)
        int c1=-1,c2=-1,p=0;
        if(y-x==1){
            //只有一个字符,肯定是数字
            len++;
            ops[len]=s[x];
            rc[len]=lc[len]=-1;
            return len;
        }
        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==-1&&c2==-1) return build(x+1,y-1);
        else if(c1==-1) c1=c2;
        //以+-为准
        int t=++len;//重要,否则递归后len就变了,会赋值错误
        ops[t]=s[c1];
        lc[t]=build(x,c1);//注意左闭右开区间
        rc[t]=build(c1+1,y);
        return t;
    }
    void zhongxu(int x){
        //因为叶子的左右子树都是0
        if(x==-1) return;
        zhongxu(lc[x]);
        cout<<ops[x];
        zhongxu(rc[x]);
    }
    int cal(int x){
        if(rc[x]==-1&&lc[x]==-1) return ops[x]-'0';
        int a,b;
        a=cal(lc[x]);
        b=cal(rc[x]);
        switch (ops[x])
        {
            case '+':return a+b;
            case '-':return a-b;
            case '*':return a*b;
            case '/':return a/b;
        }
    }
    int main()
    {   
        cin>>s;
        build(0,strlen(s));
        cout<<cal(0)<<endl;
        return 0;
    }
  • 相关阅读:
    论有一个服务器后可以干什么
    golang的安装后的文件目录解析
    使用go自带的http包搭建一个的web服务器
    python字符串问题—文件排版
    Python 整数的N进制字符串表示,循环和函数_亲密数,DNA匹配A
    mongodb 基本CRUD
    pip;python包管理工具
    STM32中assert_param的使用
    stm32.cube(一)——系统架构及目录结构
    HTTP、TCP、UDP,Socket,HTTPS
  • 原文地址:https://www.cnblogs.com/MorrowWind/p/13056522.html
Copyright © 2011-2022 走看看