千家信息网

如何实现用C++表达式求值

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇文章主要讲解了"如何实现用C++表达式求值",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何实现用C++表达式求值"吧!目录一.细节处理:1.注意
千家信息网最后更新 2025年01月19日如何实现用C++表达式求值

这篇文章主要讲解了"如何实现用C++表达式求值",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何实现用C++表达式求值"吧!

目录
  • 一.细节处理:

    • 1.注意负数 因此要进行字符串预处理

    • 2.考虑除数为0

    • 3.原字符串再加上一个定界符 '#'

    • 4.优先级:

  • 二.知识要点:

    • 三.完整源码:

      一.细节处理:

      1.注意负数 因此要进行字符串预处理

      string format(string str) {        int len = str.length();        for (int i = 0; i < len; i++)        {                if (str[i] == '-')                {                        if (i == 0) { str.insert(0, 1, '0'); }//处理-3*2+1情况                        else if (str[i - 1]=='(') { str.insert(i, 1, '0'); }//处理(-3*4+1)情况                }        }        return str;}

      2.考虑除数为0

      case '/':                                        if (0 != y) { res = x / y; }                                        else { cout << "非法表达式"; return -1; }                                        break;

      3.原字符串再加上一个定界符 '#'

      str=str+'#'

      4.优先级:

      1."("未入栈前为3 入栈后为0 2.")"和"#"为0 3."+" "-"为1 4."*"和"/"为2

      二.知识要点:

      中缀表达式转为后缀表达式

      1. 首先设置存储运算符和存储操作数两个栈 即Symbol[N]和Num[N]且分别对应top2,top1

      top1=-1 Symbol[0]='#' //运算符栈设置定界符 top2=0

      2.入栈和出栈的规则 字符串为str

      一.若str[i]>='0&&str[i]<='9',则入操作数栈并继续扫描以一个字符 即Num[++top1]=str[i++]-'0';

      二.否则 将当前字符str1与运算符栈的栈顶元素str2进行优先级比较 ,自写比较函数

      例如: str1=='+' 则若str2==# ,(,) 则返回1 说明str1比str2优先级高

      1. 此时若str1优先级大于str2 则将str1入运算符栈并继续扫描 即 Symbol[++top2]=str[i++]

      2.优先级相等则返回0 此时将运算符栈顶元素弹出,并继续扫描下一个字符即 top2-- i++

      3.若str1优先级小于str2返回-1,此时将运算符栈顶元素弹出 即op=Symbol[top2--]

      并弹出操作数栈的两个元素 即y=Num[top1--],x=Num[top1--] 之后进行计算操作

      三.最后 return Num[top1]

      三.完整源码:

      #define _CRT_SECURE_NO_WARNINGS#includeusing namespace std;class Expression{public:        _Expression(string str);        ~_Expression();        int Compute();private:        int Comp(char str1, char str2);        string str1;};Expression::_Expression(string str){        this->str1 = str + '#';//以定界符开头}Expression :: ~_Expression() {}//将中缀表达转为后缀表达int Expression::Compute(){        int Num[100], Symbol[100];//定义存操作数和运算符的两个栈        int i, k, x, y, res;        char op;        Symbol[0] = '#';        int top1 = -1, top2 = 0;        for (i = 0; str1[i] != '\0';)        {                if (str1[i] >= '0' && str1[i] <= '9') { Num[++top1] = str1[i++] - '0'; }                else {//非操作数就比较运算符优先级                        int cmp = Comp(str1[i], Symbol[top2]);                        if (cmp == 1) { Symbol[++top2] = str1[i++]; }//将运算符入栈 并接着扫描下一个字符                        else if (cmp == 0) { --top2; i++; }//优先级相等 弹栈 并接着扫描下一个字符                        else {//优先级低 继续处理当前运算符                                y = Num[top1--];//后面的数要先弹出来 才不会算反                                x= Num[top1--];                                op = Symbol[top2--];                                switch (op)                                {                                case '+':                                        res = x + y;//将运算结果入栈                                        break;                                case '-':                                        res = x - y;                                        break;                                case '*':                                        res = x * y;                                        break;                                case '/':                                        if (0 != y) { res = x / y; }                                        else { cout << "非法表达式"; return -1; }                                        break;                                default:break;                                }                                Num[++top1] = res;                        }                }        }        return Num[top1]; }string format(string str) {        int len = str.length();        for (int i = 0; i < len; i++)        {                if (str[i] == '-')                {                        if (i == 0) { str.insert(0, 1, '0'); }//处理-3*2+1情况                        else if (str[i - 1]=='(') { str.insert(i, 1, '0'); }//处理(-3*4+1)情况                }        }        return str;}int main(){        string str;        int n = 3;        while (n--)        {                cout << "请输入一个表达式: " << endl;                cin >> str;                str = format(str);                Expression E(str);                int result = E.Compute();                cout << "表达式的值的是: " << result << endl;        }        return 0;}int Expression::Comp(char str1, char str2)//当前字符元素和栈顶运算符优先级比较{        //1代表 str1优先级大于str2 0 代表相等 -1代表小于        switch (str1)        {        case'+':case'-':                 if (str2 == '#'||str2==')'||str2=='(') { return 1; }//左括号入队列后优先级变为0                else { return -1; }                break;        case'*':case'/':                if (str2 == '*' || str2 == '/') { return -1; }                else  { return 1; }                break;        case'(':                return 1;                break;        case')':                if (str2 == '(') { return 0; }                else if(str2 == '#') { return 1; }                else { return -1; }                break;        case'#':                if (str2 == '#') { return 0; }                else { return -1; }                break;        default: break;        }}

      感谢各位的阅读,以上就是"如何实现用C++表达式求值"的内容了,经过本文的学习后,相信大家对如何实现用C++表达式求值这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

      优先级 运算 字符 运算符 表达式 处理 元素 字符串 情况 操作数 C++ 定界符 两个 代表 知识 学习 中缀 内容 后缀 源码 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 应用和数据库安全测评 系统显示无法连接到远程服务器 天骐的我的世界服务器小游戏视频 诚创数据库密码 北京软件开发培训要多少钱 班级鉴定软件开发 软件开发的6类计划书 杭州对日软件开发 陕西便民平台软件开发专业制作 湖北皓亿星澜网络技术有限公司 数据库设置字段唯一约束 数据库对接与接口对接 西安手机软件开发平台 以网络安全为主题的队名 镇江创新软件开发诚信合作 重返帝国不同服务器能不能联机 新浪搭载英特尔服务器 vb如何添加数据库数据 大话西游2虎啸神州服务器 数据库日期型数据 英灵神殿服务器退出 做网络安全销售好做吗 网络安全检查及隐患排查表 戴尔服务器管理口无法访问 地面站软件开发难度 湛江财务机器人rpa软件开发 数据库中表的结构用记录来表示 怀旧服部落服务器哪里下载 CRM数据库源码 网络安全主长是谁
      0