首页 > 其他分享 >3.2.5 表达式求值

3.2.5 表达式求值

时间:2024-06-11 15:34:45浏览次数:12  
标签:ch string top opnd 3.2 求值 include 表达式 optr

表达式求值

数据结构 严蔚敏版

3.2.5 表达式求值,c++ 代码实现。

注意:
输入表达式不能有空格

#include <stack>
#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <iostream>
#include <iomanip>
using namespace std;

vector<vector<char>> precedence {
    //         +     -    *    /    (    )    #
    /*  +  */ {'>', '>', '<', '<', '<', '>', '>'},
    /*  -  */ {'>', '>', '<', '<', '<', '>', '>'},
    /*  *  */ {'>', '>', '>', '>', '<', '>', '>'},
    /*  /  */ {'>', '>', '>', '>', '<', '>', '>'},
    /*  (  */ {'<', '<', '<', '<', '<', '=', '$'},
    /*  )  */ {'>', '>', '>', '>', '$', '>', '>'},
    /*  #  */ {'<', '<', '<', '<', '<', '$', '='}
};

// 定义运算符对应的索引
unordered_map<char, int> opIndex = {
    {'+', 0},
    {'-', 1},
    {'*', 2},
    {'/', 3},
    {'(', 4},
    {')', 5},
    {'#', 6}
};

char comparePrecedence(char op1, char op2) {
    return precedence[opIndex[op1]][opIndex[op2]];
}

void printStack(const stack<int>& st1, const stack<char>& st2) {
    stack<int> tmp(st1);
    string res1;
    while (!tmp.empty()) {
        res1 = to_string(tmp.top()) + " " + res1;
        tmp.pop();
    }

    stack<char> tmp1(st2);
    string res2;
    while (!tmp1.empty()) {
        string ch;
        ch += tmp1.top();
        res2 = ch + " " + res2;
        tmp1.pop();
    }
    cout << std::left << std::setw(20) << "opnd: " + res1 << std::left << std::setw(40)  << "optr : " + res2 << endl;
}

int calculate(int a, int b, char op) {
    switch (op) {
    case '+':
        return a + b;
    case '-':
        return a - b;
    case '*':
        return a * b;
    case '/':
        return a / b;
    default:
        break;
    }
    printf("Wrong operator: %c!\n", op);
    return INT_MAX;
}

int evaluateExpression(const string& exp) {
    stack<char> optr;
    optr.push('#');
    stack<int> opnd;
    string str = exp + '#';
    unsigned i = 0;
    char ch = str[i];
    while (i < str.size() && (ch != '#' || !optr.empty())) {
        if (ch >= '0' && ch <= '9') {
            int num = 0;
            while (i < str.size() && ch >= '0' && ch <= '9') {
                num = num * 10 + (ch - '0');
                ch = str[++i];
            }
            opnd.push(num);
            printStack(opnd, optr);
        } else {
            switch (comparePrecedence(optr.top(), ch)) {
            case '<':
                optr.push(ch);
                ch = str[++i];
                break;
            case '=':
                optr.pop();
                ch = str[++i];
                break;
            case '>':
            {
                char op = optr.top();
                optr.pop();
                int num1 = opnd.top();
                opnd.pop();
                int num2 = opnd.top();
                opnd.pop();
                opnd.push(calculate(num2, num1, op));
                break;
            }
            default:
                printf("wrong expression!\n");
                return INT_MAX;
            }
            printStack(opnd, optr);
        }
    }

    return opnd.top();
}

int main()
{
    string exp = "3*(7-2)";
    int res = evaluateExpression(exp);
    cout << "res: " << res << endl;

    return 0;
}

运行结果:

opnd: 3             optr : #
opnd: 3             optr : # *
opnd: 3             optr : # * (
opnd: 3 7           optr : # * (
opnd: 3 7           optr : # * ( -
opnd: 3 7 2         optr : # * ( -
opnd: 3 5           optr : # * (
opnd: 3 5           optr : # *
opnd: 15            optr : #
opnd: 15            optr :
res: 15

标签:ch,string,top,opnd,3.2,求值,include,表达式,optr
From: https://www.cnblogs.com/AngleLin/p/18242149

相关文章

  • 华为OD刷题C卷 - 每日刷题 23(提取字符串中的最长表达式,模拟目录管理功能 - 完整实现)
    1、提取字符串中的最长表达式目标是从一个给定的字符串中提取出最长的合法简单数学表达式,并计算该表达式的值。如果存在多个同样长度的合法表达式,则选择第一个出现的表达式进行计算。简单数学表达式的规则:只包含0-9的数字和+、-、*三种运算符。所有数字的计算结果不超过......
  • 表达式求值--后缀 C++实现
    #include<iostream>#include<string>#include<stack>usingnamespacestd;intPostFixRun(stringch){stack<int>stk;for(inti=0;i<ch.size();i++){if(ch[i]>='0'&&ch[i]<='9')......
  • JAVA lambda表达式方法引用+构造器引用
    若Lambda体中的内容有方法已经实现了,使用“方法引用”注意:Lambda体中调用方法的参数列表与返回值类型,要与函数式接口中抽象方法的函数列表和返回值类型保持一致。静态方法与实例方法的区别1、静态方法属于整个类所有,因此调用它不需要实例化,可以直接调用(类.静态方法())。实例......
  • PingCastle 3.2.0.1 - Active Directory 安全检测和评估
    PingCastle3.2.0.1-ActiveDirectory安全检测和评估活动目录域安全分析工具请访问原文链接:https://sysin.org/blog/pingcastle/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org在20%的时间内获得80%的ActiveDirectory安全性ActiveDirectory正迅速成为......
  • Native Instruments Komplete Kontrol for mac(音源制作软件)v3.2.1版
    NativeInstrumentsKompleteKontrolforMac是一款功能强大的音乐制作软件,专为macOS平台设计。它为用户提供了一个统一的平台,集成了多个音频插件和虚拟乐器,包括合成器、采样器、效果器等。此外,它与NativeInstruments的硬件控制器紧密结合,如KompleteKontrolS系列键盘,提供了......
  • 表达式求值的相关语法知识(C语言)
    目录整型提升整型提升的意义整型提升规则整型提升实例算术转换赋值转换操作符的属性C语言的语法并不能保证表达式的执行路径唯一!!!问题表达式整型提升        C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整......
  • Linux -- 正则表达式基础
    提示:制作不易,可以点个关注和收藏哦。前言        虽然我们这一节的标题是正则表达式,但实际这一节实验只是介绍grep,sed,awk这三个命令,而正则表达式作为这三个命令的一种使用方式(命令输出中可以包含正则表达式)。正则表达式本身的内容很多,要把它说明清楚需要单独一门......
  • 走走停停迅雷BT下载[DB-1280P/3.25GBMKV中字]4k高清百度云资源分享
    电影《走走停停》:探寻人生的迷茫与自我救赎电影《走走停停》是一部由李安执导,由乔·阿尔文主演的心灵探索之旅。这部电影以一个中年男子的迷失和自我救赎为线索,通过对人生中的停顿和挫折的描绘,引发观众对生活意义的思考。故事的主线由两个不同的时间线交......
  • 【C++练级之路】【Lv.23】C++11——可变参数模板、lambda表达式和函数包装器
    快乐的流畅:个人主页个人专栏:《算法神殿》《数据结构世界》《进击的C++》远方有一堆篝火,在为久候之人燃烧!文章目录一、可变参数模板1.1参数包的概念1.2参数包的展开1.3emplace系列二、lambda表达式2.1lambda的格式2.2捕捉列表2.3lambda的原理2.4......
  • VCL界面组件DevExpress VCL v23.2 - 图表控件增强
    DevExpressVCL是DevExpress公司旗下最老牌的用户界面套包,所包含的控件有:数据录入、图表、数据分析、导航、布局等。该控件能帮助您创建优异的用户体验,提供高影响力的业务解决方案,并利用您现有的VCL技能为未来构建下一代应用程序。DevExpressVCLv23.2已于日前正式发布,新版本重......