千家信息网

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

发表于:2025-11-21 作者:千家信息网编辑
千家信息网最后更新 2025年11月21日,这篇文章主要讲解了"如何实现用C++表达式求值",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何实现用C++表达式求值"吧!目录一.细节处理:1.注意
千家信息网最后更新 2025年11月21日如何实现用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安全错误 数据库的锁怎样保障安全 万里长城绘画软件开发 电光猫无法联接服务器是什么原因 如何保证数据库数据安全 数据库3个表的连接怎么写 软件开发需求书样本 hp服务器默认管理口密码 网络安全工程汇报 关于网络安全性等级 优径上海软件开发有限公司 数据库原理第一章练习题 竞技世界北京网络技术公司怎么样 大专学计算机网络技术当兵 dns服务器 mac 地质学图谱库属文献型数据库 四川达尔讯互联网科技有限公司 置顶 数据库 网络安全防护工作方案 网络技术支持的公司 数据库自动补齐剩余的数据 计算机网络技术必看书籍 自动化软件开发需要学习什么 东莞pc软件开发外包 服务器机柜pdu电压监测不到 优德精密数据库下载 服务器安全组规则被我删除 网络技术部用品管理制度 北京质量软件开发设计 奉贤区网络技术服务销售方法 本机启动mysql数据库 棋牌游戏软件开发怎样盈利
      0